@elizaos/plugin-local-inference 2.0.0-beta.1 → 2.0.11-beta.7
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 +81 -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/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 +7 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.ts +54 -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 +1171 -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 +190 -0
- package/src/routes/local-inference-asr-route.ts +213 -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 +423 -0
- package/src/routes/local-inference-compat-routes.ts +782 -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/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 +53 -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 +1398 -0
- package/src/runtime/index.d.ts +14 -0
- package/src/runtime/index.d.ts.map +1 -0
- package/src/runtime/index.ts +27 -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/asr/errors.d.ts +21 -0
- package/src/services/asr/errors.d.ts.map +1 -0
- package/src/services/asr/errors.ts +50 -0
- package/src/services/asr/hash.d.ts +28 -0
- package/src/services/asr/hash.d.ts.map +1 -0
- package/src/services/asr/hash.ts +49 -0
- package/src/services/asr/index.d.ts +76 -0
- package/src/services/asr/index.d.ts.map +1 -0
- package/src/services/asr/index.ts +178 -0
- package/src/services/asr/types.d.ts +91 -0
- package/src/services/asr/types.d.ts.map +1 -0
- package/src/services/asr/types.ts +95 -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/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 +240 -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 +92 -0
- package/src/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
- package/src/services/desktop-fused-ffi-backend-runtime.ts +333 -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 +724 -0
- package/src/services/downloader.ts +899 -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 +534 -0
- package/src/services/engine.d.ts.map +1 -0
- package/src/services/engine.ts +1891 -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.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 +183 -0
- package/src/services/hardware.ts +404 -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 +281 -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 +30 -0
- package/src/services/index.d.ts.map +1 -0
- package/src/services/index.ts +225 -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 +693 -0
- package/src/services/manifest/schema.d.ts +715 -0
- package/src/services/manifest/schema.d.ts.map +1 -0
- package/src/services/manifest/schema.ts +655 -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 +569 -0
- package/src/services/memory-arbiter.d.ts +343 -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 +1000 -0
- package/src/services/memory-monitor.d.ts +119 -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 +296 -0
- package/src/services/memory-pressure.d.ts +127 -0
- package/src/services/memory-pressure.d.ts.map +1 -0
- package/src/services/memory-pressure.ts +413 -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 +672 -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 +376 -0
- package/src/services/routing-policy.d.ts +55 -0
- package/src/services/routing-policy.d.ts.map +1 -0
- package/src/services/routing-policy.ts +228 -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 +15 -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/transcription-priority.test.ts +211 -0
- package/src/services/tts/errors.ts +46 -0
- package/src/services/tts/index.ts +214 -0
- package/src/services/tts/tts-audio-cache.ts +235 -0
- package/src/services/tts/types.ts +157 -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 +92 -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 +197 -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/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 +148 -0
- package/src/services/voice/embedding.ts +244 -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 +746 -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 +2226 -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 +636 -0
- package/src/services/voice/ffi-bindings.d.ts.map +1 -0
- package/src/services/voice/ffi-bindings.test.ts +671 -0
- package/src/services/voice/ffi-bindings.ts +3050 -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/ring-buffer.d.ts +40 -0
- package/src/services/voice/ring-buffer.d.ts.map +1 -0
- package/src/services/voice/ring-buffer.ts +105 -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/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 +420 -0
- package/src/services/voice/voice-budget.ts +656 -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,58 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
5
|
+
|
|
6
|
+
import type { BackendPlan } from "./backend";
|
|
7
|
+
import { LocalInferenceEngine } from "./engine";
|
|
8
|
+
|
|
9
|
+
const ORIGINAL_ENV = { ...process.env };
|
|
10
|
+
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
process.env = { ...ORIGINAL_ENV };
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
describe("LocalInferenceEngine direct Eliza-1 bundle loads", () => {
|
|
16
|
+
it("projects modelId into catalog and bundle overrides before registry install", async () => {
|
|
17
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "eliza-engine-test-"));
|
|
18
|
+
process.env.ELIZA_STATE_DIR = root;
|
|
19
|
+
const engine = new LocalInferenceEngine();
|
|
20
|
+
const internals = engine as unknown as {
|
|
21
|
+
dispatcher: {
|
|
22
|
+
load(plan: BackendPlan): Promise<void>;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
let captured: BackendPlan | undefined;
|
|
26
|
+
internals.dispatcher.load = async (plan) => {
|
|
27
|
+
captured = plan;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const bundleRoot = path.join(root, "eliza-1-0_8b.bundle");
|
|
31
|
+
const modelPath = path.join(bundleRoot, "text", "eliza-1-0_8b-128k.gguf");
|
|
32
|
+
await engine.load(modelPath, {
|
|
33
|
+
modelPath,
|
|
34
|
+
modelId: "eliza-1-0_8b",
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
expect(captured).toBeDefined();
|
|
38
|
+
expect(captured?.modelPath).toBe(modelPath);
|
|
39
|
+
expect(captured?.modelId).toBe("eliza-1-0_8b");
|
|
40
|
+
expect(captured?.catalog?.id).toBe("eliza-1-0_8b");
|
|
41
|
+
expect(captured?.overrides?.bundleRoot).toBe(bundleRoot);
|
|
42
|
+
expect(captured?.overrides?.manifestPath).toBe(
|
|
43
|
+
path.join(bundleRoot, "eliza-1.manifest.json"),
|
|
44
|
+
);
|
|
45
|
+
expect(
|
|
46
|
+
(
|
|
47
|
+
engine as unknown as {
|
|
48
|
+
activeEliza1Bundle: { root?: string; tierId?: string } | null;
|
|
49
|
+
}
|
|
50
|
+
).activeEliza1Bundle,
|
|
51
|
+
).toEqual(
|
|
52
|
+
expect.objectContaining({
|
|
53
|
+
root: bundleRoot,
|
|
54
|
+
tierId: "eliza-1-0_8b",
|
|
55
|
+
}),
|
|
56
|
+
);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import type { GenerateArgs } from "./backend";
|
|
4
|
+
import { LocalInferenceEngine } from "./engine";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Regression guard for local chat token streaming through the engine facade.
|
|
8
|
+
*
|
|
9
|
+
* The chat reply path forces a per-turn grammar (the Stage-1 HANDLE_RESPONSE
|
|
10
|
+
* envelope) and asks for `streamStructured`. The runtime wires
|
|
11
|
+
* `params.onStreamChunk` down to the engine's `onTextChunk`, and the
|
|
12
|
+
* `ResponseSkeletonStreamExtractor` slices the `replyText` field out of the
|
|
13
|
+
* streamed JSON. For that to surface incremental deltas, the per-token
|
|
14
|
+
* callback MUST fire once per chunk all the way through the dispatcher — not
|
|
15
|
+
* collapse into a single final chunk.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const REPLY_TOKENS = [
|
|
19
|
+
'{"shouldRespond":"RESPOND",',
|
|
20
|
+
'"contexts":["simple"],',
|
|
21
|
+
'"replyText":"On ',
|
|
22
|
+
"it ",
|
|
23
|
+
'now.","facts":[]}',
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
// A minimal GBNF source — only its presence matters. This mirrors the Stage-1
|
|
27
|
+
// reply path always carrying a grammar.
|
|
28
|
+
const FORCED_GRAMMAR = 'root ::= "{" [^}]* "}"';
|
|
29
|
+
|
|
30
|
+
describe("LocalInferenceEngine.generateInConversation streaming (chat path)", () => {
|
|
31
|
+
it("forwards onTextChunk per token through the dispatcher when voice is off", async () => {
|
|
32
|
+
// The production chat reply has a conversationId, so the local handler
|
|
33
|
+
// routes through `generateInConversation` (NOT `engine.generate`). With no
|
|
34
|
+
// voice bridge active, `voiceStreamingArgs` is a passthrough, so the
|
|
35
|
+
// dispatcher must receive — and the backend must fire — `onTextChunk`
|
|
36
|
+
// per token. This is the junction the FFI-backed unit tests don't cover.
|
|
37
|
+
const engine = new LocalInferenceEngine();
|
|
38
|
+
const seenChunks: string[] = [];
|
|
39
|
+
|
|
40
|
+
const internals = engine as unknown as {
|
|
41
|
+
dispatcher: {
|
|
42
|
+
generate: (args: GenerateArgs) => Promise<string>;
|
|
43
|
+
activeBackendId: () => string | null;
|
|
44
|
+
};
|
|
45
|
+
currentModelPath: () => string | null;
|
|
46
|
+
};
|
|
47
|
+
// Drive the non-"llama-cpp" branch of generateInConversation (the
|
|
48
|
+
// usage-block-synthesizing forward path) by reporting no active FFI
|
|
49
|
+
// backend while still stubbing dispatcher.generate.
|
|
50
|
+
internals.dispatcher.activeBackendId = () => null;
|
|
51
|
+
internals.currentModelPath = () => "fake-model";
|
|
52
|
+
internals.dispatcher.generate = async (args: GenerateArgs) => {
|
|
53
|
+
// Simulate the backend firing the per-token callback.
|
|
54
|
+
for (const token of REPLY_TOKENS) {
|
|
55
|
+
await args.onTextChunk?.(token);
|
|
56
|
+
}
|
|
57
|
+
return REPLY_TOKENS.join("");
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const handle = engine.openConversation({
|
|
61
|
+
conversationId: "conv-stream-test",
|
|
62
|
+
modelId: "fake-model",
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const result = await engine.generateInConversation(handle, {
|
|
66
|
+
prompt: "say hi",
|
|
67
|
+
grammar: FORCED_GRAMMAR,
|
|
68
|
+
streamStructured: true,
|
|
69
|
+
onTextChunk: (chunk) => {
|
|
70
|
+
seenChunks.push(chunk);
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
expect(seenChunks).toEqual(REPLY_TOKENS);
|
|
75
|
+
expect(seenChunks.length).toBeGreaterThan(1);
|
|
76
|
+
expect(result.text).toBe(REPLY_TOKENS.join(""));
|
|
77
|
+
|
|
78
|
+
await engine.closeConversation(handle);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone llama.cpp engine.
|
|
3
|
+
*
|
|
4
|
+
* Fronts the in-process FFI backend (fused `libelizainference`, or the
|
|
5
|
+
* libllama + eliza-llama-shim fallback) via the `BackendDispatcher`. At most
|
|
6
|
+
* one model is loaded at a time — model swap is unload-then-load so we never
|
|
7
|
+
* double-allocate VRAM.
|
|
8
|
+
*
|
|
9
|
+
* Two consumption paths:
|
|
10
|
+
* 1. The Model Hub UI calls `load()` / `unload()` to make "Activate" work.
|
|
11
|
+
* 2. The agent runtime calls `generate()` via the registered
|
|
12
|
+
* `ModelType.TEXT_SMALL` / `TEXT_LARGE` handlers (see
|
|
13
|
+
* `ensure-local-inference-handler.ts`).
|
|
14
|
+
*/
|
|
15
|
+
import type { LocalInferenceLoadArgs } from "./active-model";
|
|
16
|
+
import type { GenerateArgs as BackendGenerateArgs, LocalRuntimeLoadConfig } from "./backend";
|
|
17
|
+
import { type ConversationHandle } from "./conversation-registry";
|
|
18
|
+
import { MemoryMonitor } from "./memory-monitor";
|
|
19
|
+
import type { CoordinatorRuntime } from "./voice/cancellation-coordinator";
|
|
20
|
+
import { EngineVoiceBridge, type EngineVoiceBridgeOptions } from "./voice/engine-bridge";
|
|
21
|
+
import type { VoicePipelineEvents } from "./voice/pipeline";
|
|
22
|
+
import { type MtpTextRunner } from "./voice/pipeline-impls";
|
|
23
|
+
import { SharedResourceRegistry } from "./voice/shared-resources";
|
|
24
|
+
import type { TextToken, TranscriptionAudio, VerifierStreamEvent } from "./voice/types";
|
|
25
|
+
export interface LocalUsageBlock {
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
input_tokens: number;
|
|
28
|
+
output_tokens: number;
|
|
29
|
+
cache_creation_input_tokens: number;
|
|
30
|
+
cache_read_input_tokens: number;
|
|
31
|
+
mtp_drafted_tokens?: number;
|
|
32
|
+
mtp_accepted_tokens?: number;
|
|
33
|
+
mtp_acceptance_rate?: number;
|
|
34
|
+
cache_hit_rate?: number;
|
|
35
|
+
}
|
|
36
|
+
export declare function resolveIdleUnloadMs(): number;
|
|
37
|
+
/**
|
|
38
|
+
* Cap on how many speculative voice responses the turn-controller (W9) may
|
|
39
|
+
* have in flight at once — derived from the running server's slot count
|
|
40
|
+
* (each speculative response needs a slot's KV) but never more than half of
|
|
41
|
+
* them (the other half stays available for confirmed turns + tool calls).
|
|
42
|
+
* Floors at 1. Override via `ELIZA_LOCAL_MAX_SPECULATIVE_RESPONSES`.
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveMaxConcurrentSpeculativeResponses(parallelSlots: number): number;
|
|
45
|
+
export type GenerateArgs = BackendGenerateArgs;
|
|
46
|
+
/**
|
|
47
|
+
* Public engine facade.
|
|
48
|
+
*
|
|
49
|
+
* Pre-existing API: `load(modelPath)`, `unload()`, `generate(args)`,
|
|
50
|
+
* plus the activity probes used by router/handler/active-model code. The
|
|
51
|
+
* implementation now sits behind the backend dispatcher; the
|
|
52
|
+
* shape is preserved so callers (active-model, router-handler, the agent
|
|
53
|
+
* runtime handler) keep working unchanged.
|
|
54
|
+
*
|
|
55
|
+
* MTP now lives in the normal optimized llama.cpp backend path. The
|
|
56
|
+
* dispatcher's decision tree picks `llama-cpp` when a kernel is required
|
|
57
|
+
* or when the catalog prefers optimized llama.cpp.
|
|
58
|
+
*/
|
|
59
|
+
export declare class LocalInferenceEngine {
|
|
60
|
+
/**
|
|
61
|
+
* In-process FFI backend — the sole text runtime, served by the FUSED
|
|
62
|
+
* `libelizainference` (`desktop-fused-ffi-backend-runtime.ts`). Text gen,
|
|
63
|
+
* same-file MTP speculative decoding, KV-cache quant, native tokenization,
|
|
64
|
+
* and vision-describe all run through the one fused lib the voice subsystem
|
|
65
|
+
* already loads (ABI v9). libllama has been retired: a fused lib that is
|
|
66
|
+
* absent or lacks the v9 capabilities is a loud `LocalInferenceUnavailable`
|
|
67
|
+
* error, never a silent fallback. There is no server fallback for Eliza-1.
|
|
68
|
+
*/
|
|
69
|
+
private readonly ffiBackend;
|
|
70
|
+
private readonly dispatcher;
|
|
71
|
+
/**
|
|
72
|
+
* Active voice-streaming bridge (`EngineVoiceBridge`). Only set when an
|
|
73
|
+
* Eliza-1 bundle has been activated AND `startVoice()` has succeeded —
|
|
74
|
+
* see `packages/inference/AGENTS.md` §3 + §4. The engine never lazily
|
|
75
|
+
* stands up a voice session: callers either start it explicitly or get
|
|
76
|
+
* a hard error.
|
|
77
|
+
*/
|
|
78
|
+
private voiceBridge;
|
|
79
|
+
private voiceReadyPromise;
|
|
80
|
+
/**
|
|
81
|
+
* The general onload/offload coordinator (W10 / J5). One registry per
|
|
82
|
+
* engine: text + voice both ref-count their shared resources against it,
|
|
83
|
+
* and every resident model role registers an `EvictableModelRole` here so
|
|
84
|
+
* the `MemoryMonitor` can walk them ascending-priority under RAM pressure.
|
|
85
|
+
* The voice bridge gets this passed in (see `startVoice`) so it doesn't
|
|
86
|
+
* spin up a private one.
|
|
87
|
+
*/
|
|
88
|
+
private readonly sharedResources;
|
|
89
|
+
/**
|
|
90
|
+
* RAM-pressure monitor (J2). Started when a model loads, stopped when the
|
|
91
|
+
* engine unloads. Evicts the lowest-priority resident role when free RAM
|
|
92
|
+
* crosses the low-water line.
|
|
93
|
+
*/
|
|
94
|
+
private readonly memoryMonitor;
|
|
95
|
+
/** Wall-clock ms of the last `useModel`-style activity. */
|
|
96
|
+
private lastActivityMs;
|
|
97
|
+
/** Idle-unload timer (J3); null when disabled or no model loaded. */
|
|
98
|
+
private idleUnloadTimer;
|
|
99
|
+
/** Evictable text-target role id registered on `sharedResources`, or null. */
|
|
100
|
+
private textTargetRoleId;
|
|
101
|
+
/** Evictable drafter role id registered on `sharedResources`, or null. */
|
|
102
|
+
/**
|
|
103
|
+
* The active Eliza-1 bundle (root dir + tier id), resolved at `load()`
|
|
104
|
+
* from the InstalledModel path/id. `null` when the loaded model is not an
|
|
105
|
+
* Eliza-1 bundle (a user-installed custom). Drives bundle-relative voice
|
|
106
|
+
* resolution — the Kokoro TTS root and the per-tier EOT turn-detector
|
|
107
|
+
* revision.
|
|
108
|
+
*/
|
|
109
|
+
private activeEliza1Bundle;
|
|
110
|
+
/**
|
|
111
|
+
* The general onload/offload coordinator for this engine. Exposed so the
|
|
112
|
+
* voice lifecycle, the embedding route, and any other resident model role
|
|
113
|
+
* can register an `EvictableModelRole` against the same registry the
|
|
114
|
+
* `MemoryMonitor` walks under pressure.
|
|
115
|
+
*/
|
|
116
|
+
getSharedResources(): SharedResourceRegistry;
|
|
117
|
+
/** The RAM-pressure monitor. Exposed for diagnostics / tests. */
|
|
118
|
+
getMemoryMonitor(): MemoryMonitor;
|
|
119
|
+
/** Record `useModel`-style activity so the idle-unload timer stays armed. */
|
|
120
|
+
private markActivity;
|
|
121
|
+
/**
|
|
122
|
+
* Once a model is resident: register the text target as an evictable role,
|
|
123
|
+
* start the memory monitor, and arm the idle-unload timer. Idempotent.
|
|
124
|
+
*/
|
|
125
|
+
private startBackgroundManagement;
|
|
126
|
+
/** Stop the memory monitor + idle timer and deregister evictable roles. */
|
|
127
|
+
private stopBackgroundManagement;
|
|
128
|
+
private registerResidentRoles;
|
|
129
|
+
private deregisterResidentRoles;
|
|
130
|
+
private armIdleUnloadTimer;
|
|
131
|
+
/**
|
|
132
|
+
* Cap on concurrent speculative voice responses (W9 / J4): derived from
|
|
133
|
+
* the running server's slot count (each speculative response needs a KV
|
|
134
|
+
* slot), never more than half of them, floored at 1. The voice
|
|
135
|
+
* turn-controller reads this before kicking a speculative response.
|
|
136
|
+
*/
|
|
137
|
+
maxConcurrentSpeculativeResponses(): number;
|
|
138
|
+
/**
|
|
139
|
+
* Auto-tune the running server's `--parallel` (J4): when the conversation
|
|
140
|
+
* high-water mark has outgrown the configured slot count AND there's RAM
|
|
141
|
+
* headroom for the extra KV slots, resize/restart llama.cpp with the larger
|
|
142
|
+
* value so new conversations get their own slot instead of thrashing.
|
|
143
|
+
* Returns `true` when a resize was performed. No-op when the FFI backend
|
|
144
|
+
* isn't loaded. Best-effort: a failed restart leaves the old `--parallel`
|
|
145
|
+
* in place and logs.
|
|
146
|
+
*/
|
|
147
|
+
maybeAutoResizeParallel(): Promise<boolean>;
|
|
148
|
+
available(): Promise<boolean>;
|
|
149
|
+
currentModelPath(): string | null;
|
|
150
|
+
hasLoadedModel(): boolean;
|
|
151
|
+
activeBackendId(): "capacitor-llama" | "llama-cpp" | null;
|
|
152
|
+
currentRuntimeLoadConfig(): LocalRuntimeLoadConfig | null;
|
|
153
|
+
unload(): Promise<void>;
|
|
154
|
+
load(modelPath: string, resolved?: LocalInferenceLoadArgs): Promise<void>;
|
|
155
|
+
generate(args: GenerateArgs): Promise<string>;
|
|
156
|
+
/**
|
|
157
|
+
* Vision describe via the running llama.cpp mtmd path. Requires the FFI
|
|
158
|
+
* backend with an mmproj-loaded bundle. The mmproj GGUF must have been
|
|
159
|
+
* declared by the active catalog tier and present on disk under the
|
|
160
|
+
* bundle root; if not, the active backend throws.
|
|
161
|
+
*
|
|
162
|
+
* No fallback: Florence-2 / Transformers.js was the previous fallback
|
|
163
|
+
* and has been removed (see VISION_MIGRATION.md).
|
|
164
|
+
*/
|
|
165
|
+
describeImage(args: {
|
|
166
|
+
bytes: Uint8Array;
|
|
167
|
+
mimeType?: string;
|
|
168
|
+
prompt?: string;
|
|
169
|
+
maxTokens?: number;
|
|
170
|
+
temperature?: number;
|
|
171
|
+
signal?: AbortSignal;
|
|
172
|
+
}): Promise<{
|
|
173
|
+
text: string;
|
|
174
|
+
projectorMs?: number;
|
|
175
|
+
decodeMs?: number;
|
|
176
|
+
}>;
|
|
177
|
+
/** True when the active server can serve vision describe (mmproj loaded). */
|
|
178
|
+
canDescribeImages(): boolean;
|
|
179
|
+
/**
|
|
180
|
+
* Diagnostic snapshot of an in-process JS session pool. Always null on the
|
|
181
|
+
* FFI runtime — its KV slots live in the native backend (C), not in a JS
|
|
182
|
+
* session pool. Retained so the API cache-stats panel keeps a stable shape.
|
|
183
|
+
*/
|
|
184
|
+
describeSessionPool(): {
|
|
185
|
+
size: number;
|
|
186
|
+
maxSize: number;
|
|
187
|
+
keys: string[];
|
|
188
|
+
} | null;
|
|
189
|
+
/**
|
|
190
|
+
* Reserve a slot for a long-lived conversation. Subsequent
|
|
191
|
+
* `generateInConversation` calls reuse the same slot, so the prefix
|
|
192
|
+
* KV survives across turns regardless of hash collisions with other
|
|
193
|
+
* concurrent conversations.
|
|
194
|
+
*
|
|
195
|
+
* Idempotent for the same (conversationId, modelId): repeated open
|
|
196
|
+
* calls return the same handle. The runtime side should call this
|
|
197
|
+
* lazily on the first turn of a conversation and `closeConversation`
|
|
198
|
+
* when the chat session ends.
|
|
199
|
+
*/
|
|
200
|
+
openConversation(args: {
|
|
201
|
+
conversationId: string;
|
|
202
|
+
modelId: string;
|
|
203
|
+
ttlMs?: number;
|
|
204
|
+
}): ConversationHandle;
|
|
205
|
+
/**
|
|
206
|
+
* Run one generation pinned to a previously-opened conversation
|
|
207
|
+
* handle. Cache key, slot id, and (for optimized llama.cpp) kv-restore are
|
|
208
|
+
* all owned by the registry — callers don't need to thread them.
|
|
209
|
+
*
|
|
210
|
+
* Returns the Anthropic-shape `LocalUsageBlock` alongside the text so
|
|
211
|
+
* agentic callers can surface cache-hit telemetry without re-scraping
|
|
212
|
+
* `/metrics` themselves.
|
|
213
|
+
*/
|
|
214
|
+
generateInConversation(handle: ConversationHandle, args: Omit<GenerateArgs, "cacheKey">): Promise<{
|
|
215
|
+
text: string;
|
|
216
|
+
usage: LocalUsageBlock;
|
|
217
|
+
slotId: number;
|
|
218
|
+
}>;
|
|
219
|
+
/**
|
|
220
|
+
* KV-prefill a conversation's pinned slot with a known prompt prefix
|
|
221
|
+
* (system prompt + provider context + tool/action schema block + the
|
|
222
|
+
* assistant-turn start), before the real request lands. This is item I1 /
|
|
223
|
+
* C1 of the voice swarm — fire it the moment a message arrives / STT
|
|
224
|
+
* starts so the response-handler prompt is already in the slot's KV when
|
|
225
|
+
* the user's tokens are appended.
|
|
226
|
+
*
|
|
227
|
+
* `conversationOrId` may be a `ConversationHandle` (preferred — pins to
|
|
228
|
+
* the handle's slot) or a raw conversation id (a handle is opened on the
|
|
229
|
+
* fly so the slot derivation matches the real request). Idempotent /
|
|
230
|
+
* cheap to call repeatedly: `cache_prompt: true` reuses the prefix so a
|
|
231
|
+
* second call is a no-op forward pass. Only meaningful once the FFI
|
|
232
|
+
* backend is loaded — returns false otherwise. Returns true when a
|
|
233
|
+
* pre-warm request was issued.
|
|
234
|
+
*/
|
|
235
|
+
prewarmConversation(conversationOrId: ConversationHandle | string, promptPrefix: string, opts?: {
|
|
236
|
+
modelId?: string;
|
|
237
|
+
}): Promise<boolean>;
|
|
238
|
+
/**
|
|
239
|
+
* Close + drop a conversation handle. Persists the final KV state to
|
|
240
|
+
* disk so a later open with the same id can lazy-restore. Idempotent;
|
|
241
|
+
* closing an unknown id is a no-op.
|
|
242
|
+
*/
|
|
243
|
+
closeConversation(handle: ConversationHandle): Promise<void>;
|
|
244
|
+
/**
|
|
245
|
+
* Read-side accessor for the conversation registry. The runtime handler
|
|
246
|
+
* uses this to look up an existing handle before opening a new one,
|
|
247
|
+
* avoiding the need to thread a handle through every layer.
|
|
248
|
+
*/
|
|
249
|
+
conversation(conversationId: string, modelId: string): ConversationHandle | null;
|
|
250
|
+
/**
|
|
251
|
+
* Largest concurrent open-conversation count seen this process lifetime.
|
|
252
|
+
* The auto-tune-parallel path consults this and warns when it exceeds
|
|
253
|
+
* the running server's slot count.
|
|
254
|
+
*/
|
|
255
|
+
conversationHighWaterMark(): number;
|
|
256
|
+
/**
|
|
257
|
+
* Recommended `--parallel` value given the current conversation
|
|
258
|
+
* high-water mark plus a small headroom (max(2, 25%)), never below the
|
|
259
|
+
* running slot count. Delegates to `ConversationRegistry.recommendedParallel`
|
|
260
|
+
* so the math lives in one place. When this exceeds `parallelSlots()` the
|
|
261
|
+
* engine can grow the running server (`maybeAutoResizeParallel`).
|
|
262
|
+
*/
|
|
263
|
+
recommendedParallel(): number;
|
|
264
|
+
/**
|
|
265
|
+
* Emit a one-line warning when the running `--parallel` slot count is
|
|
266
|
+
* below the recommended value (high-water mark + headroom). Returns true
|
|
267
|
+
* when a warning was emitted. No-op when the FFI backend isn't loaded.
|
|
268
|
+
* The actual resize is `maybeAutoResizeParallel()`
|
|
269
|
+
* — kept separate from this hot-path check so a `useModel` call never
|
|
270
|
+
* blocks on (or is interrupted by) a server restart; the auto-resize is
|
|
271
|
+
* opted into via `ELIZA_LOCAL_AUTO_RESIZE_PARALLEL=1`, in which case this
|
|
272
|
+
* also kicks one off fire-and-forget.
|
|
273
|
+
*/
|
|
274
|
+
warnIfParallelTooLow(logger?: {
|
|
275
|
+
warn: (msg: string) => void;
|
|
276
|
+
}): boolean;
|
|
277
|
+
/**
|
|
278
|
+
* Start the voice-streaming pipeline against an already-activated
|
|
279
|
+
* Eliza-1 bundle. Per AGENTS.md §3, voice is mandatory for Eliza-1
|
|
280
|
+
* tiers — every required artifact (speaker preset, fused FFI when
|
|
281
|
+
* `useFfiBackend`, bundle root) is checked up front and missing
|
|
282
|
+
* pieces surface as `VoiceStartupError`. There is no silent fallback
|
|
283
|
+
* to text-only, no log-and-continue.
|
|
284
|
+
*
|
|
285
|
+
* Idempotent guard: starting twice without `stopVoice()` between
|
|
286
|
+
* surfaces a hard error so callers do not double-allocate the
|
|
287
|
+
* scheduler.
|
|
288
|
+
*/
|
|
289
|
+
startVoice(opts: EngineVoiceBridgeOptions): EngineVoiceBridge;
|
|
290
|
+
/**
|
|
291
|
+
* True when a voice session is currently active on the engine. Callers
|
|
292
|
+
* use this to decide whether to lazy-start one (e.g. the TTS model
|
|
293
|
+
* handler in `ensure-local-inference-handler.ts`, which auto-starts a
|
|
294
|
+
* Kokoro-only bridge on the first TEXT_TO_SPEECH invocation when the
|
|
295
|
+
* Kokoro artifacts are on disk and no Eliza-1 bundle has activated).
|
|
296
|
+
*/
|
|
297
|
+
hasActiveVoiceBridge(): boolean;
|
|
298
|
+
/**
|
|
299
|
+
* Arm the voice lifecycle on the active bridge — lazily loads the TTS
|
|
300
|
+
* mmap region, optional ASR region when present, voice caches, and
|
|
301
|
+
* voice scheduler nodes via the shared resource registry. Throws
|
|
302
|
+
* `VoiceLifecycleError` if any
|
|
303
|
+
* required artifact is unavailable (RAM pressure, mmap fail, kernel
|
|
304
|
+
* missing) — see `voice/lifecycle.ts` for the structured codes.
|
|
305
|
+
*
|
|
306
|
+
* Required before sustained voice use; `startVoice()` only stands up
|
|
307
|
+
* the cold scheduler and bridge. Splitting setup from arming lets
|
|
308
|
+
* the engine keep the voice surface in voice-off (no heavy weights
|
|
309
|
+
* mapped) until the user actually toggles voice on.
|
|
310
|
+
*/
|
|
311
|
+
armVoice(): Promise<void>;
|
|
312
|
+
/**
|
|
313
|
+
* Lazily start + arm voice for the active Eliza-1 bundle. Runtime model
|
|
314
|
+
* handlers use this when visible chat text needs local speech output; direct
|
|
315
|
+
* engine callers still use `startVoice()` / `armVoice()` explicitly when they
|
|
316
|
+
* need custom sinks or test backends.
|
|
317
|
+
*/
|
|
318
|
+
ensureActiveBundleVoiceReady(): Promise<EngineVoiceBridge>;
|
|
319
|
+
private ensureActiveBundleVoiceReadyOnce;
|
|
320
|
+
/**
|
|
321
|
+
* Assemble + run the full live voice loop on top of `startVoice()` /
|
|
322
|
+
* `armVoice()`: mic → (`pipeMicToRingBuffer` + `VadDetector.pushFrame`)
|
|
323
|
+
* per frame → `StreamingTranscriber.feed` (VAD-gated) → `VoiceTurnController`
|
|
324
|
+
* (speculative-on-pause, abort-on-resume, finalize/promote, barge-in) →
|
|
325
|
+
* `VoiceScheduler` → TTS → audio sink.
|
|
326
|
+
*
|
|
327
|
+
* Gated behind a complete real backend chain (AGENTS.md §3 — no silent
|
|
328
|
+
* backend-mode "voice"):
|
|
329
|
+
* - a `MicSource` (caller-supplied, or `DesktopMicSource` under Electrobun),
|
|
330
|
+
* - a Silero v5 GGML VAD (caller-supplied detector, or `createSileroVadDetector()` — runs through libelizainference's native VAD ABI),
|
|
331
|
+
* - a working ASR (the bridge's `createStreamingTranscriber` throws
|
|
332
|
+
* `AsrUnavailableError` when the fused decoder is unavailable — the
|
|
333
|
+
* fused build is the sole on-device ASR runtime),
|
|
334
|
+
* - a real OmniVoice TTS backend on the bridge (the `StubOmniVoiceBackend`
|
|
335
|
+
* is rejected — it emits zeros).
|
|
336
|
+
* Any missing piece fails loudly with the specific component named.
|
|
337
|
+
*
|
|
338
|
+
* `prewarm` defaults to `this.prewarmConversation(roomId, "")` (best-effort
|
|
339
|
+
* KV-prefill); a caller with the response-handler stable prefix (W6) should
|
|
340
|
+
* pass its own. `generate` is required — it builds the message and runs the
|
|
341
|
+
* runtime turn (streaming `replyText` into TTS via this engine's
|
|
342
|
+
* `generate({ onTextChunk })`, which routes through the voice scheduler).
|
|
343
|
+
*/
|
|
344
|
+
startVoiceSession(opts: {
|
|
345
|
+
roomId: string;
|
|
346
|
+
/** Mic source. Defaults to a `DesktopMicSource` (Electrobun). */
|
|
347
|
+
micSource?: import("./voice/types").MicSource;
|
|
348
|
+
/** VAD detector. Defaults to `createSileroVadDetector()`. */
|
|
349
|
+
vad?: import("./voice/vad").VadDetector;
|
|
350
|
+
/** Run one turn: build the message + stream `replyText` into TTS. Required. */
|
|
351
|
+
generate: (request: import("./voice/turn-controller").VoiceGenerateRequest) => Promise<import("./voice/turn-controller").VoiceTurnOutcome>;
|
|
352
|
+
/**
|
|
353
|
+
* Semantic turn detector layered with VAD/STT. Defaults to the local
|
|
354
|
+
* LiveKit ONNX model when installed, otherwise the deterministic heuristic.
|
|
355
|
+
* Pass `false` only for tests/manual troubleshooting.
|
|
356
|
+
*/
|
|
357
|
+
turnDetector?: import("./voice/eot-classifier").EotClassifier | false;
|
|
358
|
+
/** Optional local LiveKit turn-detector directory override. */
|
|
359
|
+
turnDetectorModelDir?: string;
|
|
360
|
+
/**
|
|
361
|
+
* Use the already-loaded eliza-1 text model as the EOT classifier — see
|
|
362
|
+
* `voice/eliza1-eot-scorer.ts`. When set, the runtime skips the
|
|
363
|
+
* separate LiveKit/Turnsense ONNX and reads P(`<|im_end|>`) directly
|
|
364
|
+
* off the live model.
|
|
365
|
+
*
|
|
366
|
+
* `"auto"` (default): use eliza-1 EOT when `ELIZA_VOICE_EOT_BACKEND=eliza-1`
|
|
367
|
+
* or when no bundled LiveKit ONNX is resolvable; otherwise fall
|
|
368
|
+
* through to the existing LiveKit path. `true` forces eliza-1 EOT
|
|
369
|
+
* (throws if the active backend is not in-process). `false` forces
|
|
370
|
+
* the historical LiveKit path.
|
|
371
|
+
*/
|
|
372
|
+
useEliza1Eot?: boolean | "auto";
|
|
373
|
+
/**
|
|
374
|
+
* Optional path to a fine-tuned EOT LoRA adapter to layer on top of
|
|
375
|
+
* the drafter at scoring time. The training recipe lives in
|
|
376
|
+
* `packages/training/scripts/turn_detector/`.
|
|
377
|
+
*/
|
|
378
|
+
eliza1EotLoraPath?: string;
|
|
379
|
+
/** KV-prefill / response-handler-prefix prewarm. Defaults to `prewarmConversation`. */
|
|
380
|
+
prewarm?: (roomId: string) => void | Promise<void>;
|
|
381
|
+
speculatePauseMs?: number;
|
|
382
|
+
events?: import("./voice/turn-controller").VoiceTurnControllerEvents;
|
|
383
|
+
/**
|
|
384
|
+
* Opt-in openWakeWord hotword gate (local mode only — the
|
|
385
|
+
* local-inference engine never runs in cloud mode, and the connector
|
|
386
|
+
* UI hides this surface there per AGENTS.md §5 hide-not-disable).
|
|
387
|
+
* Disabled by default: voice mode works push-to-talk / VAD-gated
|
|
388
|
+
* without it. When `enabled` and the bundle ships the openWakeWord
|
|
389
|
+
* graphs, mic frames are also fanned into an `OpenWakeWordDetector`;
|
|
390
|
+
* each fresh detection prewarms the conversation and calls `onWake`
|
|
391
|
+
* (the same place a push-to-talk press would arm a listening window).
|
|
392
|
+
* Silently inert when the bundle has no wake-word model.
|
|
393
|
+
*/
|
|
394
|
+
wakeWord?: {
|
|
395
|
+
enabled: boolean;
|
|
396
|
+
/** Wake phrase head name (defaults to the bundle's `hey-eliza`). */
|
|
397
|
+
head?: string;
|
|
398
|
+
/** P(wake) firing threshold (openWakeWord default ~0.5). */
|
|
399
|
+
threshold?: number;
|
|
400
|
+
/** Called once per detected utterance (refractory-debounced). */
|
|
401
|
+
onWake?: () => void;
|
|
402
|
+
};
|
|
403
|
+
/**
|
|
404
|
+
* Runtime reference for cancellation coordination (W3-9 F1).
|
|
405
|
+
*
|
|
406
|
+
* @deprecated G5.d: pass `runtime` to `startVoice()` (the
|
|
407
|
+
* `EngineVoiceBridgeOptions`) instead. The bridge is the canonical
|
|
408
|
+
* owner of `VoiceCancellationCoordinator` + `OptimisticGenerationPolicy`,
|
|
409
|
+
* and `startVoiceSession()` now delegates to the bridge's coordinator.
|
|
410
|
+
* When this field is supplied here without a matching bridge-level
|
|
411
|
+
* runtime, `startVoiceSession()` logs once and ignores it — the
|
|
412
|
+
* canonical wiring lives on the bridge.
|
|
413
|
+
*/
|
|
414
|
+
runtime?: CoordinatorRuntime;
|
|
415
|
+
}): Promise<import("./voice/turn-controller").VoiceTurnController>;
|
|
416
|
+
/**
|
|
417
|
+
* Disarm the voice lifecycle — drains the ring buffer, settles the
|
|
418
|
+
* scheduler, and drops TTS/ASR weights from RAM via `evictPages()`
|
|
419
|
+
* (madvise / VirtualUnlock equivalent — see voice/engine-bridge.ts).
|
|
420
|
+
* No-op when not armed.
|
|
421
|
+
*/
|
|
422
|
+
disarmVoice(): Promise<void>;
|
|
423
|
+
/**
|
|
424
|
+
* Tear down the active voice bridge. Idempotent; calling when no
|
|
425
|
+
* voice session is active is a no-op. Disarms the lifecycle first
|
|
426
|
+
* (drops voice weights via `evictPages`), then settles any in-flight
|
|
427
|
+
* TTS so audio committed to the ring buffer surfaces to the sink
|
|
428
|
+
* before the bridge is dropped.
|
|
429
|
+
*/
|
|
430
|
+
stopVoice(): Promise<void>;
|
|
431
|
+
synthesizeSpeech(text: string, signal?: AbortSignal): Promise<Uint8Array>;
|
|
432
|
+
prewarmVoicePhrases(texts: ReadonlyArray<string>, opts?: {
|
|
433
|
+
concurrency?: number;
|
|
434
|
+
}): Promise<{
|
|
435
|
+
warmed: number;
|
|
436
|
+
cached: number;
|
|
437
|
+
}>;
|
|
438
|
+
/**
|
|
439
|
+
* Idle-time auto-prewarm: synthesize the canonical common-phrase seed so
|
|
440
|
+
* the phrase cache is warm before the next turn. No-op unless a real TTS
|
|
441
|
+
* backend is present and voice is armed. Callers (the voice bridge /
|
|
442
|
+
* connector) invoke this when the loop is idle.
|
|
443
|
+
*/
|
|
444
|
+
prewarmIdleVoicePhrases(opts?: {
|
|
445
|
+
concurrency?: number;
|
|
446
|
+
}): Promise<{
|
|
447
|
+
warmed: number;
|
|
448
|
+
cached: number;
|
|
449
|
+
}>;
|
|
450
|
+
/**
|
|
451
|
+
* Play the first-audio filler (a short cached acknowledgement) — the seam
|
|
452
|
+
* W9's turn controller calls the instant VAD fires `speech-start` to mask
|
|
453
|
+
* first-token latency. Returns the played filler text, or `null` if none
|
|
454
|
+
* was played. No-op without a real TTS backend / armed voice.
|
|
455
|
+
*/
|
|
456
|
+
playFirstAudioFiller(): string | null;
|
|
457
|
+
transcribePcm(args: TranscriptionAudio, signal?: AbortSignal): Promise<string>;
|
|
458
|
+
/**
|
|
459
|
+
* Run one fused mic→speech voice turn through the overlapped
|
|
460
|
+
* `VoicePipeline`: ASR → {MTP drafts ∥ target verifies} → phrase
|
|
461
|
+
* chunker → OmniVoice → PCM ring buffer, with rollback-on-reject and
|
|
462
|
+
* barge-in cancel. Requires `startVoice()` + `armVoice()` first.
|
|
463
|
+
*
|
|
464
|
+
* `opts.textRunner` lets a host that runs its own text engine in-process
|
|
465
|
+
* (the iOS/Android FFI path or the desktop FFI runtime) supply its own
|
|
466
|
+
* {@link MtpTextRunner}. When omitted, the active local dispatcher is
|
|
467
|
+
* used.
|
|
468
|
+
*
|
|
469
|
+
* Resolves with the turn's exit reason (`done` / `token-cap` /
|
|
470
|
+
* `cancelled`). A missing ASR region in voice mode surfaces as a
|
|
471
|
+
* `VoiceStartupError` — no silent cloud fallback (AGENTS.md §3).
|
|
472
|
+
*/
|
|
473
|
+
runVoiceTurn(audio: TranscriptionAudio, opts?: {
|
|
474
|
+
maxDraftTokens?: number;
|
|
475
|
+
maxGeneratedTokens?: number;
|
|
476
|
+
events?: VoicePipelineEvents;
|
|
477
|
+
/**
|
|
478
|
+
* In-process text runner for the mobile FFI path. Must implement the
|
|
479
|
+
* same `MtpTextRunner` contract (`hasDrafter()` +
|
|
480
|
+
* `generateWithVerifierEvents()`); the AOSP/Capacitor bridge wraps
|
|
481
|
+
* its libllama-context-backed speculative loop in one.
|
|
482
|
+
*/
|
|
483
|
+
textRunner?: MtpTextRunner;
|
|
484
|
+
}): Promise<"done" | "token-cap" | "cancelled">;
|
|
485
|
+
/**
|
|
486
|
+
* Active voice bridge, or null when voice mode is not running.
|
|
487
|
+
* Callers (router, UI, agent runtime) read this to decide whether to
|
|
488
|
+
* forward verifier events. Voice is mandatory for Eliza-1 tiers but
|
|
489
|
+
* the bridge is still created lazily — `startVoice()` MUST be called
|
|
490
|
+
* before `voice()` returns non-null.
|
|
491
|
+
*/
|
|
492
|
+
voice(): EngineVoiceBridge | null;
|
|
493
|
+
private requireVoiceBridge;
|
|
494
|
+
private voiceStreamingArgs;
|
|
495
|
+
/**
|
|
496
|
+
* Forward a verifier-stream event into the voice scheduler. Accepted tokens flow into the
|
|
497
|
+
* phrase chunker; rejected ranges trigger the rollback queue. No-op
|
|
498
|
+
* when voice is not active so callers can fan out events
|
|
499
|
+
* unconditionally.
|
|
500
|
+
*
|
|
501
|
+
* When MTP produces an accepted text token, the phrase chunker MUST hand
|
|
502
|
+
* the chunk to TTS within the same scheduler tick.
|
|
503
|
+
*/
|
|
504
|
+
pushVerifierEvent(event: VerifierStreamEvent): Promise<void>;
|
|
505
|
+
/**
|
|
506
|
+
* Mic VAD → barge-in. Per AGENTS.md §4, the PCM ring buffer MUST
|
|
507
|
+
* drain immediately and any in-flight TTS forward pass MUST be
|
|
508
|
+
* cancelled at the next kernel boundary. The scheduler enforces both
|
|
509
|
+
* — this is a thin pass-through.
|
|
510
|
+
*/
|
|
511
|
+
triggerBargeIn(): void;
|
|
512
|
+
/**
|
|
513
|
+
* Test surface: fan an accepted-token list into the bridge in one
|
|
514
|
+
* call. Production callers should prefer `pushVerifierEvent` so the
|
|
515
|
+
* accept/reject discriminator stays explicit; this exists so the
|
|
516
|
+
* voice integration test can drive the scheduler without
|
|
517
|
+
* reconstructing `VerifierStreamEvent` boilerplate.
|
|
518
|
+
*/
|
|
519
|
+
pushAcceptedTokens(tokens: ReadonlyArray<TextToken>): Promise<void>;
|
|
520
|
+
/**
|
|
521
|
+
* Active llama.cpp parallel slot count from the running FFI backend, or
|
|
522
|
+
* the configured default pool size when no model is loaded yet.
|
|
523
|
+
*/
|
|
524
|
+
private activeParallel;
|
|
525
|
+
/**
|
|
526
|
+
* The in-process `Eliza1EotClassifier` required a node-bound `LlamaModel`
|
|
527
|
+
* forward pass, which the FFI runtime does not expose. Always null now —
|
|
528
|
+
* callers fall through to the GGUF (FFI) turn-detector and then the
|
|
529
|
+
* heuristic chain.
|
|
530
|
+
*/
|
|
531
|
+
private tryBuildEliza1EotClassifier;
|
|
532
|
+
}
|
|
533
|
+
export declare const localInferenceEngine: LocalInferenceEngine;
|
|
534
|
+
//# sourceMappingURL=engine.d.ts.map
|