@elizaos/plugin-local-inference 2.0.3-beta.2 → 2.0.3-beta.4
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/README.md +84 -10
- package/dist/actions/generate-media.d.ts.map +1 -0
- package/dist/actions/identify-speaker.d.ts.map +1 -0
- package/dist/actions/transcription-control.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/environment.d.ts +12 -0
- package/dist/adapters/capacitor-llama/environment.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/index.browser.d.ts +9 -0
- package/dist/adapters/capacitor-llama/index.browser.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/index.d.ts +18 -0
- package/dist/adapters/capacitor-llama/index.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/loader.d.ts +35 -0
- package/dist/adapters/capacitor-llama/loader.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/native-voice-capture.d.ts +70 -0
- package/dist/adapters/capacitor-llama/native-voice-capture.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/structured-output.d.ts +62 -0
- package/dist/adapters/capacitor-llama/structured-output.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/text-streaming.d.ts +24 -0
- package/dist/adapters/capacitor-llama/text-streaming.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/types.d.ts +338 -0
- package/dist/adapters/capacitor-llama/types.d.ts.map +1 -0
- package/dist/adapters/capacitor-llama/voice-turn.d.ts +86 -0
- package/dist/adapters/capacitor-llama/voice-turn.d.ts.map +1 -0
- package/dist/backends/apple-foundation.d.ts +56 -0
- package/dist/backends/apple-foundation.d.ts.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39647 -0
- package/dist/index.js.map +217 -0
- package/{src → dist}/local-inference-routes.d.ts +9 -0
- package/dist/local-inference-routes.d.ts.map +1 -0
- package/dist/provider.d.ts.map +1 -0
- package/{src → dist}/routes/compat-helpers.d.ts +1 -1
- package/dist/routes/compat-helpers.d.ts.map +1 -0
- package/dist/routes/family-member-route.d.ts.map +1 -0
- package/{src → dist}/routes/index.d.ts +1 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +42040 -0
- package/dist/routes/index.js.map +236 -0
- package/{src → dist}/routes/live-diarization-route.d.ts +7 -0
- package/dist/routes/live-diarization-route.d.ts.map +1 -0
- package/dist/routes/local-inference-asr-route.d.ts.map +1 -0
- package/dist/routes/local-inference-asr-transcribe.d.ts.map +1 -0
- package/dist/routes/local-inference-compat-routes.d.ts.map +1 -0
- package/dist/routes/local-inference-tts-route.d.ts.map +1 -0
- package/dist/routes/native-pcm-turn-route.d.ts +3 -0
- package/dist/routes/native-pcm-turn-route.d.ts.map +1 -0
- package/dist/routes/transcript-audio-store.d.ts.map +1 -0
- package/{src → dist}/routes/transcripts-routes.d.ts +8 -0
- package/dist/routes/transcripts-routes.d.ts.map +1 -0
- package/dist/routes/voice-first-run-routes.d.ts.map +1 -0
- package/dist/routes/voice-models-routes.d.ts.map +1 -0
- package/dist/routes/voice-profile-plugin-routes.d.ts.map +1 -0
- package/dist/routes/voice-profiles-management-routes.d.ts.map +1 -0
- package/dist/routes/voice-speaker-profile-routes.d.ts.map +1 -0
- package/dist/runtime/embedding-manager-support.d.ts.map +1 -0
- package/dist/runtime/embedding-presets.d.ts.map +1 -0
- package/dist/runtime/embedding-warmup-policy.d.ts.map +1 -0
- package/{src → dist}/runtime/ensure-local-inference-handler.d.ts +8 -0
- package/dist/runtime/ensure-local-inference-handler.d.ts.map +1 -0
- package/{src → dist}/runtime/index.d.ts +1 -1
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +38768 -0
- package/dist/runtime/index.js.map +217 -0
- package/dist/runtime/mobile-local-inference-gate.d.ts +63 -0
- package/dist/runtime/mobile-local-inference-gate.d.ts.map +1 -0
- package/{src → dist}/runtime/voice-entity-binding.d.ts +10 -0
- package/dist/runtime/voice-entity-binding.d.ts.map +1 -0
- package/{src → dist}/services/active-model.d.ts +28 -0
- package/dist/services/active-model.d.ts.map +1 -0
- package/dist/services/asr-provenance.d.ts +5 -0
- package/dist/services/asr-provenance.d.ts.map +1 -0
- package/{src → dist}/services/assignments.d.ts +16 -3
- package/dist/services/assignments.d.ts.map +1 -0
- package/dist/services/backend-selector.d.ts +55 -0
- package/dist/services/backend-selector.d.ts.map +1 -0
- package/{src → dist}/services/backend.d.ts +110 -16
- package/dist/services/backend.d.ts.map +1 -0
- package/{src → dist}/services/bionic-host-loader.d.ts +21 -0
- package/dist/services/bionic-host-loader.d.ts.map +1 -0
- package/dist/services/bundled-models.d.ts.map +1 -0
- package/dist/services/cache-bridge.d.ts.map +1 -0
- package/dist/services/catalog.d.ts +10 -0
- package/dist/services/catalog.d.ts.map +1 -0
- package/dist/services/checkpoint-client.d.ts.map +1 -0
- package/dist/services/checkpoint-manager.d.ts +217 -0
- package/dist/services/checkpoint-manager.d.ts.map +1 -0
- package/dist/services/cloud-fallback.d.ts.map +1 -0
- package/dist/services/context-fit.d.ts +36 -0
- package/dist/services/context-fit.d.ts.map +1 -0
- package/dist/services/conversation-registry.d.ts.map +1 -0
- package/{src → dist}/services/desktop-fused-ffi-backend-runtime.d.ts +22 -6
- package/dist/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
- package/dist/services/device-bridge.d.ts.map +1 -0
- package/dist/services/device-resource-metrics.d.ts.map +1 -0
- package/{src → dist}/services/device-tier.d.ts +19 -1
- package/dist/services/device-tier.d.ts.map +1 -0
- package/{src → dist}/services/downloader.d.ts +16 -4
- package/dist/services/downloader.d.ts.map +1 -0
- package/{src → dist}/services/engine.d.ts +43 -4
- package/dist/services/engine.d.ts.map +1 -0
- package/dist/services/ensure-local-artifacts.d.ts +82 -0
- package/dist/services/ensure-local-artifacts.d.ts.map +1 -0
- package/dist/services/external-scanner.d.ts.map +1 -0
- package/dist/services/ffi-llm-mock.d.ts +90 -0
- package/dist/services/ffi-llm-mock.d.ts.map +1 -0
- package/dist/services/ffi-llm-streaming-abi.d.ts +318 -0
- package/dist/services/ffi-llm-streaming-abi.d.ts.map +1 -0
- package/{src → dist}/services/ffi-streaming-backend.d.ts +28 -7
- package/dist/services/ffi-streaming-backend.d.ts.map +1 -0
- package/{src → dist}/services/ffi-streaming-runner.d.ts +24 -0
- package/dist/services/ffi-streaming-runner.d.ts.map +1 -0
- package/dist/services/gpu-autotune.d.ts +150 -0
- package/dist/services/gpu-autotune.d.ts.map +1 -0
- package/dist/services/gpu-detect.d.ts.map +1 -0
- package/dist/services/handler-registry.d.ts.map +1 -0
- package/dist/services/hardware.d.ts.map +1 -0
- package/dist/services/image-description-runtime.d.ts.map +1 -0
- package/dist/services/imagegen/aosp-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/backend-selector.d.ts.map +1 -0
- package/dist/services/imagegen/coreml-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/errors.d.ts.map +1 -0
- package/dist/services/imagegen/index.d.ts.map +1 -0
- package/dist/services/imagegen/mflux.d.ts.map +1 -0
- package/{src → dist}/services/imagegen/sd-cpp.d.ts +1 -0
- package/dist/services/imagegen/sd-cpp.d.ts.map +1 -0
- package/dist/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
- package/dist/services/imagegen/types.d.ts.map +1 -0
- package/{src → dist}/services/index.d.ts +3 -1
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +39453 -0
- package/dist/services/index.js.map +227 -0
- package/dist/services/inference-capabilities.d.ts.map +1 -0
- package/dist/services/inference-telemetry.d.ts.map +1 -0
- package/dist/services/ios-llama-streaming.d.ts +119 -0
- package/dist/services/ios-llama-streaming.d.ts.map +1 -0
- package/dist/services/kv-spill.d.ts.map +1 -0
- package/dist/services/latency-trace.d.ts.map +1 -0
- package/dist/services/lib-target.d.ts +55 -0
- package/dist/services/lib-target.d.ts.map +1 -0
- package/dist/services/live-signals.d.ts +86 -0
- package/dist/services/live-signals.d.ts.map +1 -0
- package/dist/services/llama-server-metrics.d.ts +114 -0
- package/dist/services/llama-server-metrics.d.ts.map +1 -0
- package/dist/services/llm-streaming-binding.d.ts.map +1 -0
- package/dist/services/load-args.d.ts.map +1 -0
- package/dist/services/manifest/index.d.ts +4 -0
- package/dist/services/manifest/index.d.ts.map +1 -0
- package/{src → dist}/services/manifest/schema.d.ts +196 -6
- package/dist/services/manifest/schema.d.ts.map +1 -0
- package/{src → dist}/services/manifest/types.d.ts +3 -1
- package/dist/services/manifest/types.d.ts.map +1 -0
- package/dist/services/manifest/validator.d.ts.map +1 -0
- package/{src → dist}/services/memory-arbiter.d.ts +33 -3
- package/dist/services/memory-arbiter.d.ts.map +1 -0
- package/dist/services/memory-benchmark.d.ts +76 -0
- package/dist/services/memory-benchmark.d.ts.map +1 -0
- package/{src → dist}/services/memory-monitor.d.ts +6 -0
- package/dist/services/memory-monitor.d.ts.map +1 -0
- package/dist/services/memory-pressure.d.ts.map +1 -0
- package/dist/services/mtp-doctor.d.ts.map +1 -0
- package/dist/services/network-policy.d.ts.map +1 -0
- package/dist/services/paths.d.ts.map +1 -0
- package/dist/services/planner-skeleton.d.ts.map +1 -0
- package/dist/services/providers.d.ts.map +1 -0
- package/dist/services/ram-budget.d.ts.map +1 -0
- package/dist/services/readiness.d.ts.map +1 -0
- package/dist/services/recommendation.d.ts.map +1 -0
- package/{src → dist}/services/registry.d.ts +11 -13
- package/dist/services/registry.d.ts.map +1 -0
- package/{src → dist}/services/router-handler.d.ts +2 -2
- package/dist/services/router-handler.d.ts.map +1 -0
- package/{src → dist}/services/routing-policy.d.ts +32 -9
- package/dist/services/routing-policy.d.ts.map +1 -0
- package/dist/services/routing-preferences.d.ts.map +1 -0
- package/dist/services/runtime-target.d.ts.map +1 -0
- package/{src → dist}/services/service.d.ts +1 -1
- package/dist/services/service.d.ts.map +1 -0
- package/dist/services/session-pool.d.ts.map +1 -0
- package/dist/services/structured-output/deterministic-repair.d.ts.map +1 -0
- package/dist/services/structured-output/index.d.ts +2 -0
- package/dist/services/structured-output/index.d.ts.map +1 -0
- package/dist/services/structured-output.d.ts.map +1 -0
- package/dist/services/system-memory.d.ts.map +1 -0
- package/{src → dist}/services/types.d.ts +1 -1
- package/dist/services/types.d.ts.map +1 -0
- package/dist/services/verify-on-device.d.ts.map +1 -0
- package/dist/services/verify.d.ts.map +1 -0
- package/dist/services/vision/aosp-unavailable.d.ts.map +1 -0
- package/dist/services/vision/capacitor-llama.d.ts.map +1 -0
- package/dist/services/vision/cloud-fallback.d.ts.map +1 -0
- package/dist/services/vision/hash.d.ts.map +1 -0
- package/{src → dist}/services/vision/index.d.ts +1 -1
- package/dist/services/vision/index.d.ts.map +1 -0
- package/dist/services/vision/llama-server.d.ts.map +1 -0
- package/{src → dist}/services/vision/types.d.ts +13 -4
- package/dist/services/vision/types.d.ts.map +1 -0
- package/dist/services/vision/vast-fallback.d.ts.map +1 -0
- package/{src → dist}/services/vision-embedding-cache.d.ts +1 -1
- package/dist/services/vision-embedding-cache.d.ts.map +1 -0
- package/dist/services/voice/__test-helpers__/fake-ffi.d.ts +27 -0
- package/dist/services/voice/__test-helpers__/fake-ffi.d.ts.map +1 -0
- package/dist/services/voice/__test-helpers__/synthetic-speech.d.ts +66 -0
- package/dist/services/voice/__test-helpers__/synthetic-speech.d.ts.map +1 -0
- package/dist/services/voice/acoustic-speaker-attribution.d.ts +61 -0
- package/dist/services/voice/acoustic-speaker-attribution.d.ts.map +1 -0
- package/{src → dist}/services/voice/audio-frame-consumer.d.ts +82 -0
- package/dist/services/voice/audio-frame-consumer.d.ts.map +1 -0
- package/dist/services/voice/barge-in.d.ts.map +1 -0
- package/dist/services/voice/cancellation-coordinator.d.ts.map +1 -0
- package/dist/services/voice/checkpoint-manager.d.ts.map +1 -0
- package/dist/services/voice/checkpoint-policy.d.ts +178 -0
- package/dist/services/voice/checkpoint-policy.d.ts.map +1 -0
- package/dist/services/voice/corpus-augment.d.ts +111 -0
- package/dist/services/voice/corpus-augment.d.ts.map +1 -0
- package/dist/services/voice/corpus-generator.d.ts +134 -0
- package/dist/services/voice/corpus-generator.d.ts.map +1 -0
- package/dist/services/voice/diarization-error-rate.d.ts +40 -0
- package/dist/services/voice/diarization-error-rate.d.ts.map +1 -0
- package/dist/services/voice/e2e-harness.d.ts +297 -0
- package/dist/services/voice/e2e-harness.d.ts.map +1 -0
- package/dist/services/voice/eager-context-builder.d.ts.map +1 -0
- package/dist/services/voice/echo-delay.d.ts +67 -0
- package/dist/services/voice/echo-delay.d.ts.map +1 -0
- package/dist/services/voice/echo-metrics.d.ts +7 -0
- package/dist/services/voice/echo-metrics.d.ts.map +1 -0
- package/dist/services/voice/echo-reference-buffer.d.ts +65 -0
- package/dist/services/voice/echo-reference-buffer.d.ts.map +1 -0
- package/{src → dist}/services/voice/eliza1-eot-scorer.d.ts +8 -8
- package/dist/services/voice/eliza1-eot-scorer.d.ts.map +1 -0
- package/dist/services/voice/embedding-server.d.ts +37 -0
- package/dist/services/voice/embedding-server.d.ts.map +1 -0
- package/{src → dist}/services/voice/embedding.d.ts +2 -3
- package/dist/services/voice/embedding.d.ts.map +1 -0
- package/dist/services/voice/emotion-attribution.d.ts.map +1 -0
- package/{src → dist}/services/voice/engine-bridge.d.ts +8 -5
- package/dist/services/voice/engine-bridge.d.ts.map +1 -0
- package/{src → dist}/services/voice/eot-classifier-ggml.d.ts +22 -22
- package/dist/services/voice/eot-classifier-ggml.d.ts.map +1 -0
- package/{src → dist}/services/voice/eot-classifier.d.ts +9 -12
- package/dist/services/voice/eot-classifier.d.ts.map +1 -0
- package/{src → dist}/services/voice/errors.d.ts +1 -1
- package/dist/services/voice/errors.d.ts.map +1 -0
- package/{src → dist}/services/voice/expressive-tags.d.ts +5 -5
- package/dist/services/voice/expressive-tags.d.ts.map +1 -0
- package/{src → dist}/services/voice/ffi-bindings.d.ts +26 -4
- package/dist/services/voice/ffi-bindings.d.ts.map +1 -0
- package/dist/services/voice/first-line-cache.d.ts.map +1 -0
- package/{src → dist}/services/voice/fused-eot-scorer.d.ts +6 -6
- package/dist/services/voice/fused-eot-scorer.d.ts.map +1 -0
- package/{src → dist}/services/voice/index.d.ts +8 -3
- package/dist/services/voice/index.d.ts.map +1 -0
- package/dist/services/voice/kokoro/index.d.ts +24 -0
- package/dist/services/voice/kokoro/index.d.ts.map +1 -0
- package/{src → dist}/services/voice/kokoro/kokoro-backend.d.ts +15 -0
- package/dist/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
- package/{src → dist}/services/voice/kokoro/kokoro-engine-discovery.d.ts +1 -1
- package/dist/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
- package/{src → dist}/services/voice/kokoro/kokoro-ffi-runtime.d.ts +3 -3
- package/dist/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
- package/dist/services/voice/kokoro/kokoro-runtime.d.ts.map +1 -0
- package/dist/services/voice/kokoro/phoneme-stream.d.ts +51 -0
- package/dist/services/voice/kokoro/phoneme-stream.d.ts.map +1 -0
- package/dist/services/voice/kokoro/phonemizer.d.ts.map +1 -0
- package/{src → dist}/services/voice/kokoro/pick-runtime.d.ts +1 -1
- package/dist/services/voice/kokoro/pick-runtime.d.ts.map +1 -0
- package/dist/services/voice/kokoro/runtime-selection.d.ts +31 -0
- package/dist/services/voice/kokoro/runtime-selection.d.ts.map +1 -0
- package/dist/services/voice/kokoro/types.d.ts.map +1 -0
- package/dist/services/voice/kokoro/voice-presets.d.ts.map +1 -0
- package/dist/services/voice/kokoro/voices.d.ts.map +1 -0
- package/dist/services/voice/lifecycle.d.ts.map +1 -0
- package/dist/services/voice/live-diarization-session.d.ts +196 -0
- package/dist/services/voice/live-diarization-session.d.ts.map +1 -0
- package/dist/services/voice/metric-math.d.ts +10 -0
- package/dist/services/voice/metric-math.d.ts.map +1 -0
- package/{src → dist}/services/voice/mic-source.d.ts +1 -1
- package/dist/services/voice/mic-source.d.ts.map +1 -0
- package/dist/services/voice/nlms-echo-canceller.d.ts +137 -0
- package/dist/services/voice/nlms-echo-canceller.d.ts.map +1 -0
- package/dist/services/voice/optimistic-policy.d.ts.map +1 -0
- package/dist/services/voice/optimistic-rollback.d.ts +151 -0
- package/dist/services/voice/optimistic-rollback.d.ts.map +1 -0
- package/{src → dist}/services/voice/partial-stabilizer.d.ts +1 -1
- package/dist/services/voice/partial-stabilizer.d.ts.map +1 -0
- package/dist/services/voice/phoneme-tokenizer.d.ts.map +1 -0
- package/dist/services/voice/phrase-cache.d.ts.map +1 -0
- package/dist/services/voice/phrase-chunker.d.ts.map +1 -0
- package/dist/services/voice/pipeline-impls.d.ts.map +1 -0
- package/dist/services/voice/pipeline.d.ts.map +1 -0
- package/dist/services/voice/prefill-client.d.ts.map +1 -0
- package/dist/services/voice/prefix-preserving-queue.d.ts.map +1 -0
- package/dist/services/voice/profile-store.d.ts.map +1 -0
- package/dist/services/voice/ring-buffer.d.ts.map +1 -0
- package/dist/services/voice/rollback-queue.d.ts.map +1 -0
- package/dist/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
- package/dist/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
- package/dist/services/voice/scheduler.d.ts.map +1 -0
- package/dist/services/voice/self-voice-imprint.d.ts +33 -0
- package/dist/services/voice/self-voice-imprint.d.ts.map +1 -0
- package/{src → dist}/services/voice/shared-resources.d.ts +14 -0
- package/dist/services/voice/shared-resources.d.ts.map +1 -0
- package/dist/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
- package/dist/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
- package/dist/services/voice/speaker/diarizer.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder-fused.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
- package/dist/services/voice/speaker/encoder.d.ts.map +1 -0
- package/dist/services/voice/speaker-imprint.d.ts.map +1 -0
- package/dist/services/voice/speaker-preset-cache.d.ts.map +1 -0
- package/dist/services/voice/streaming-asr/streaming-pipeline-adapter.d.ts +160 -0
- package/dist/services/voice/streaming-asr/streaming-pipeline-adapter.d.ts.map +1 -0
- package/dist/services/voice/system-audio-sink.d.ts.map +1 -0
- package/{src → dist}/services/voice/transcriber.d.ts +4 -4
- package/dist/services/voice/transcriber.d.ts.map +1 -0
- package/dist/services/voice/transcript-knowledge.d.ts.map +1 -0
- package/{src → dist}/services/voice/transcript-service.d.ts +20 -1
- package/dist/services/voice/transcript-service.d.ts.map +1 -0
- package/{src → dist}/services/voice/transcript-store.d.ts +12 -1
- package/dist/services/voice/transcript-store.d.ts.map +1 -0
- package/dist/services/voice/turn-controller.d.ts.map +1 -0
- package/{src → dist}/services/voice/types.d.ts +6 -6
- package/dist/services/voice/types.d.ts.map +1 -0
- package/{src → dist}/services/voice/vad.d.ts +6 -5
- package/dist/services/voice/vad.d.ts.map +1 -0
- package/dist/services/voice/voice-budget.d.ts.map +1 -0
- package/dist/services/voice/voice-emotion-classifier.d.ts.map +1 -0
- package/dist/services/voice/voice-preload-predictor.d.ts +76 -0
- package/dist/services/voice/voice-preload-predictor.d.ts.map +1 -0
- package/{src → dist}/services/voice/voice-preset-format.d.ts +2 -2
- package/dist/services/voice/voice-preset-format.d.ts.map +1 -0
- package/dist/services/voice/voice-profile-artifact.d.ts.map +1 -0
- package/dist/services/voice/voice-profile-routes.d.ts.map +1 -0
- package/dist/services/voice/voice-scenario.d.ts +131 -0
- package/dist/services/voice/voice-scenario.d.ts.map +1 -0
- package/dist/services/voice/voice-state-machine.d.ts.map +1 -0
- package/dist/services/voice/voice-workbench-report.d.ts +117 -0
- package/dist/services/voice/voice-workbench-report.d.ts.map +1 -0
- package/{src → dist}/services/voice/wake-word-ggml.d.ts +8 -9
- package/dist/services/voice/wake-word-ggml.d.ts.map +1 -0
- package/dist/services/voice/wake-word.d.ts.map +1 -0
- package/dist/services/voice/wav-codec.d.ts +11 -0
- package/dist/services/voice/wav-codec.d.ts.map +1 -0
- package/dist/services/voice/workbench-entrypoint.d.ts +42 -0
- package/dist/services/voice/workbench-entrypoint.d.ts.map +1 -0
- package/dist/services/voice/workbench-headless-runner.d.ts +102 -0
- package/dist/services/voice/workbench-headless-runner.d.ts.map +1 -0
- package/dist/services/voice/workbench-logic-services.d.ts +36 -0
- package/dist/services/voice/workbench-logic-services.d.ts.map +1 -0
- package/dist/services/voice/workbench-real-services.d.ts +17 -0
- package/dist/services/voice/workbench-real-services.d.ts.map +1 -0
- package/dist/services/voice/workbench-scenarios.d.ts +24 -0
- package/dist/services/voice/workbench-scenarios.d.ts.map +1 -0
- package/dist/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
- package/dist/services/voice-model-updater.d.ts.map +1 -0
- package/dist/services/voice-prewarm.d.ts.map +1 -0
- package/dist/voice-workbench.d.ts +18 -0
- package/dist/voice-workbench.d.ts.map +1 -0
- package/dist/voice-workbench.js +5259 -0
- package/dist/voice-workbench.js.map +34 -0
- package/package.json +28 -9
- package/registry-entry.json +137 -0
- package/src/adapters/capacitor-llama/__tests__/voice-turn.test.ts +293 -0
- package/src/adapters/capacitor-llama/environment.ts +1 -1
- package/src/adapters/capacitor-llama/index.ts +28 -4
- package/src/adapters/capacitor-llama/native-voice-capture.ts +140 -0
- package/src/adapters/capacitor-llama/text-streaming.ts +2 -2
- package/src/adapters/capacitor-llama/voice-turn.ts +178 -0
- package/src/backends/apple-foundation.ts +1 -1
- package/src/local-inference-routes.test.ts +57 -11
- package/src/local-inference-routes.ts +90 -8
- package/src/provider.ts +32 -3
- package/src/routes/compat-helpers.ts +2 -1
- package/src/routes/index.ts +1 -0
- package/src/routes/live-diarization-route.test.ts +134 -0
- package/src/routes/live-diarization-route.ts +79 -3
- package/src/routes/local-inference-asr-route.test.ts +43 -2
- package/src/routes/local-inference-asr-route.ts +7 -4
- package/src/routes/local-inference-asr-transcribe.test.ts +4 -4
- package/src/routes/local-inference-asr-transcribe.ts +1 -1
- package/src/routes/local-inference-compat-routes.test.ts +3 -3
- package/src/routes/local-inference-compat-routes.ts +23 -56
- package/src/routes/native-pcm-turn-route.test.ts +136 -0
- package/src/routes/native-pcm-turn-route.ts +121 -0
- package/src/routes/transcripts-routes.test.ts +51 -0
- package/src/routes/transcripts-routes.ts +35 -3
- package/src/runtime/bionic-wire-encoding.test.ts +147 -0
- package/src/runtime/ensure-local-inference-handler.test.ts +203 -5
- package/src/runtime/ensure-local-inference-handler.ts +203 -11
- package/src/runtime/index.ts +4 -1
- package/src/runtime/mobile-local-inference-gate.test.ts +85 -2
- package/src/runtime/mobile-local-inference-gate.ts +60 -5
- package/src/runtime/voice-entity-binding.transcript.test.ts +29 -0
- package/src/runtime/voice-entity-binding.ts +46 -6
- package/src/runtime/voice-speaker-entity-contract.test.ts +149 -0
- package/src/services/README.md +2 -2
- package/src/services/__tests__/backend-selector.precedence.test.ts +333 -0
- package/src/services/active-model-context-fit.test.ts +125 -0
- package/src/services/active-model.ts +211 -8
- package/src/services/asr-provenance.ts +68 -0
- package/src/services/assignment-validation.test.ts +118 -0
- package/src/services/assignments.test.ts +26 -0
- package/src/services/assignments.ts +52 -4
- package/src/services/backend.test.ts +84 -0
- package/src/services/backend.ts +198 -19
- package/src/services/bionic-host-loader.test.ts +94 -1
- package/src/services/bionic-host-loader.ts +72 -0
- package/src/services/cache-bridge.test.ts +7 -7
- package/src/services/catalog.test.ts +32 -11
- package/src/services/catalog.ts +6 -0
- package/src/services/cloud-fallback.ts +1 -1
- package/src/services/context-fit.test.ts +121 -0
- package/src/services/context-fit.ts +113 -0
- package/src/services/desktop-fused-ffi-backend-runtime.ts +99 -7
- package/src/services/device-tier.test.ts +89 -2
- package/src/services/device-tier.ts +103 -11
- package/src/services/downloader.test.ts +199 -58
- package/src/services/downloader.ts +141 -27
- package/src/services/engine-direct-bundle.test.ts +38 -6
- package/src/services/engine.ts +291 -104
- package/src/services/ensure-local-artifacts.ts +1 -1
- package/src/services/ffi-llm-streaming-abi.ts +6 -3
- package/src/services/ffi-streaming-backend.ts +44 -8
- package/src/services/ffi-streaming-runner.test.ts +163 -3
- package/src/services/ffi-streaming-runner.ts +54 -1
- package/src/services/ffi-unload-ordering.test.ts +5 -1
- package/src/services/fused-eliza1-no-regression.test.ts +144 -0
- package/src/services/hardware.test.ts +7 -2
- package/src/services/hardware.ts +28 -0
- package/src/services/imagegen/backend-selector.test.ts +190 -0
- package/src/services/imagegen/sd-cpp.ts +6 -9
- package/src/services/index.ts +18 -0
- package/src/services/ios-llama-streaming.ts +1 -1
- package/src/services/kv-spill.ts +6 -5
- package/src/services/lib-target.test.ts +145 -0
- package/src/services/lib-target.ts +102 -0
- package/src/services/live-signals.test.ts +132 -0
- package/src/services/live-signals.ts +177 -0
- package/src/services/llama-server-metrics.test.ts +168 -0
- package/src/services/manifest/eliza-1.manifest.v1.json +84 -2
- package/src/services/manifest/index.ts +6 -0
- package/src/services/manifest/manifest.test.ts +156 -54
- package/src/services/manifest/schema.ts +160 -52
- package/src/services/manifest/types.ts +6 -0
- package/src/services/manifest/validator.ts +91 -25
- package/src/services/memory-arbiter.test.ts +139 -0
- package/src/services/memory-arbiter.ts +81 -15
- package/src/services/memory-benchmark.test.ts +91 -0
- package/src/services/memory-benchmark.ts +354 -0
- package/src/services/memory-monitor.test.ts +24 -0
- package/src/services/memory-monitor.ts +12 -0
- package/src/services/mtp-doctor.ts +10 -2
- package/src/services/network-policy.ts +5 -5
- package/src/services/ram-budget-cache.test.ts +2 -1
- package/src/services/ram-budget.ts +0 -0
- package/src/services/recommendation.test.ts +216 -0
- package/src/services/registry.ts +25 -19
- package/src/services/required-kernels-gate.test.ts +64 -0
- package/src/services/router-handler.ts +43 -24
- package/src/services/routing-policy.test.ts +211 -23
- package/src/services/routing-policy.ts +92 -22
- package/src/services/service.test.ts +3 -3
- package/src/services/service.ts +22 -7
- package/src/services/transcription-priority.test.ts +2 -2
- package/src/services/types.ts +4 -0
- package/src/services/verify-on-device.test.ts +2 -2
- package/src/services/vision/hash.ts +1 -1
- package/src/services/vision/index.ts +2 -2
- package/src/services/vision/llama-server.ts +1 -1
- package/src/services/vision/types.ts +13 -4
- package/src/services/vision-embedding-cache.ts +1 -1
- package/src/services/voice/VOICE_WORKBENCH.md +71 -26
- package/src/services/voice/__fixtures__/voice-workbench-logic-baseline.json +180 -0
- package/src/services/voice/__test-helpers__/synthetic-speech.ts +72 -2
- package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +29 -29
- package/src/services/voice/__tests__/streaming-asr.test.ts +1 -1
- package/src/services/voice/acoustic-speaker-attribution.test.ts +165 -0
- package/src/services/voice/acoustic-speaker-attribution.ts +336 -0
- package/src/services/voice/asr-timed.real.test.ts +6 -8
- package/src/services/voice/audio-frame-consumer.test.ts +327 -1
- package/src/services/voice/audio-frame-consumer.ts +165 -5
- package/src/services/voice/barge-in.ts +2 -3
- package/src/services/voice/corpus-augment.test.ts +276 -0
- package/src/services/voice/corpus-augment.ts +451 -0
- package/src/services/voice/corpus-generator.test.ts +201 -0
- package/src/services/voice/corpus-generator.ts +413 -0
- package/src/services/voice/diarization-error-rate.greedy.test.ts +140 -0
- package/src/services/voice/diarization-error-rate.test.ts +100 -0
- package/src/services/voice/diarization-error-rate.ts +249 -0
- package/src/services/voice/e2e-harness.der.test.ts +94 -0
- package/src/services/voice/e2e-harness.respond-eot-entity.test.ts +277 -0
- package/src/services/voice/e2e-harness.security-echo.test.ts +103 -0
- package/src/services/voice/e2e-harness.test.ts +2 -2
- package/src/services/voice/e2e-harness.ts +175 -16
- package/src/services/voice/echo-delay.test.ts +118 -0
- package/src/services/voice/echo-delay.ts +135 -0
- package/src/services/voice/echo-metrics.test.ts +17 -0
- package/src/services/voice/echo-metrics.ts +20 -0
- package/src/services/voice/echo-reference-buffer.test.ts +86 -0
- package/src/services/voice/echo-reference-buffer.ts +165 -0
- package/src/services/voice/eliza1-eot-scorer.ts +22 -22
- package/src/services/voice/embedding.ts +2 -3
- package/src/services/voice/engine-bridge-transcript-join.test.ts +278 -0
- package/src/services/voice/engine-bridge.ts +151 -110
- package/src/services/voice/eot-classifier-ggml.ts +42 -39
- package/src/services/voice/eot-classifier.test.ts +98 -0
- package/src/services/voice/eot-classifier.ts +11 -122
- package/src/services/voice/errors.ts +2 -0
- package/src/services/voice/expressive-tags.asr.test.ts +77 -0
- package/src/services/voice/expressive-tags.test.ts +102 -0
- package/src/services/voice/expressive-tags.ts +8 -8
- package/src/services/voice/ffi-bindings.test.ts +10 -3
- package/src/services/voice/ffi-bindings.ts +177 -15
- package/src/services/voice/fused-eot-scorer.ts +17 -13
- package/src/services/voice/index.ts +33 -12
- package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +112 -1
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +88 -3
- package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +37 -201
- package/src/services/voice/kokoro/kokoro-backend.ts +16 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.ts +1 -1
- package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +3 -3
- package/src/services/voice/kokoro/pick-runtime.ts +1 -1
- package/src/services/voice/kokoro/runtime-selection.ts +28 -201
- package/src/services/voice/live-diarization-session.echo.test.ts +232 -0
- package/src/services/voice/live-diarization-session.ts +335 -2
- package/src/services/voice/metric-math.test.ts +61 -0
- package/src/services/voice/metric-math.ts +25 -0
- package/src/services/voice/mic-source.ts +1 -1
- package/src/services/voice/nlms-echo-canceller.test.ts +244 -0
- package/src/services/voice/nlms-echo-canceller.ts +317 -0
- package/src/services/voice/optimistic-policy.power-source.test.ts +36 -0
- package/src/services/voice/partial-stabilizer.ts +1 -1
- package/src/services/voice/pipeline.ts +3 -4
- package/src/services/voice/research/VOICE_8785_ASSESSMENT.md +141 -0
- package/src/services/voice/research/VOICE_PIPELINE_RESEARCH_2026.md +117 -0
- package/src/services/voice/research/VOICE_VALIDATION_RUNBOOK.md +135 -0
- package/src/services/voice/samantha-preset-regenerator.wav.test.ts +90 -0
- package/src/services/voice/self-voice-imprint.test.ts +59 -0
- package/src/services/voice/self-voice-imprint.ts +102 -0
- package/src/services/voice/shared-resources.ts +23 -0
- package/src/services/voice/speaker/attribution-pipeline.test.ts +221 -0
- package/src/services/voice/speaker/attribution-pipeline.ts +85 -22
- package/src/services/voice/speaker/encoder-ggml.test.ts +59 -0
- package/src/services/voice/transcriber.asr-backend.test.ts +76 -0
- package/src/services/voice/transcriber.ts +4 -4
- package/src/services/voice/transcript-service.test.ts +58 -0
- package/src/services/voice/transcript-service.ts +64 -0
- package/src/services/voice/transcript-store.test.ts +36 -0
- package/src/services/voice/transcript-store.ts +32 -0
- package/src/services/voice/types.ts +7 -7
- package/src/services/voice/vad.test.ts +33 -15
- package/src/services/voice/vad.ts +25 -20
- package/src/services/voice/voice-budget.test.ts +0 -3
- package/src/services/voice/voice-budget.ts +6 -6
- package/src/services/voice/voice-duet.test.ts +1 -1
- package/src/services/voice/voice-hardening.fuzz.test.ts +116 -0
- package/src/services/voice/voice-preload-predictor.test.ts +130 -0
- package/src/services/voice/voice-preload-predictor.ts +113 -0
- package/src/services/voice/voice-preset-format.fuzz.test.ts +89 -0
- package/src/services/voice/voice-preset-format.test.ts +75 -0
- package/src/services/voice/voice-preset-format.ts +17 -4
- package/src/services/voice/voice-scenario.test.ts +159 -0
- package/src/services/voice/voice-scenario.ts +133 -7
- package/src/services/voice/voice-scenario.turn-helpers.test.ts +77 -0
- package/src/services/voice/voice-workbench-report.ts +58 -17
- package/src/services/voice/wake-word-ggml.ts +12 -13
- package/src/services/voice/wav-codec.fuzz.test.ts +59 -0
- package/src/services/voice/wav-codec.test.ts +32 -0
- package/src/services/voice/wav-codec.ts +101 -0
- package/src/services/voice/workbench-entrypoint.test.ts +55 -0
- package/src/services/voice/workbench-entrypoint.ts +88 -0
- package/src/services/voice/workbench-headless-runner.test.ts +162 -0
- package/src/services/voice/workbench-headless-runner.ts +396 -0
- package/src/services/voice/workbench-logic-services.test.ts +225 -0
- package/src/services/voice/workbench-logic-services.ts +184 -0
- package/src/services/voice/workbench-real-services.ts +629 -0
- package/src/services/voice/workbench-scenarios.ts +407 -0
- package/src/services/voice-prewarm.ts +1 -1
- package/src/voice-workbench.ts +71 -0
- package/src/actions/generate-media.d.ts.map +0 -1
- package/src/actions/identify-speaker.d.ts.map +0 -1
- package/src/actions/transcription-control.d.ts.map +0 -1
- package/src/index.d.ts.map +0 -1
- package/src/local-inference-routes.d.ts.map +0 -1
- package/src/provider.d.ts.map +0 -1
- package/src/routes/compat-helpers.d.ts.map +0 -1
- package/src/routes/family-member-route.d.ts.map +0 -1
- package/src/routes/index.d.ts.map +0 -1
- package/src/routes/live-diarization-route.d.ts.map +0 -1
- package/src/routes/local-inference-asr-route.d.ts.map +0 -1
- package/src/routes/local-inference-asr-transcribe.d.ts.map +0 -1
- package/src/routes/local-inference-compat-routes.d.ts.map +0 -1
- package/src/routes/local-inference-tts-route.d.ts.map +0 -1
- package/src/routes/transcript-audio-store.d.ts.map +0 -1
- package/src/routes/transcripts-routes.d.ts.map +0 -1
- package/src/routes/voice-first-run-routes.d.ts.map +0 -1
- package/src/routes/voice-models-routes.d.ts.map +0 -1
- package/src/routes/voice-profile-plugin-routes.d.ts.map +0 -1
- package/src/routes/voice-profiles-management-routes.d.ts.map +0 -1
- package/src/routes/voice-speaker-profile-routes.d.ts.map +0 -1
- package/src/runtime/embedding-manager-support.d.ts.map +0 -1
- package/src/runtime/embedding-presets.d.ts.map +0 -1
- package/src/runtime/embedding-warmup-policy.d.ts.map +0 -1
- package/src/runtime/ensure-local-inference-handler.d.ts.map +0 -1
- package/src/runtime/index.d.ts.map +0 -1
- package/src/runtime/mobile-local-inference-gate.d.ts +0 -31
- package/src/runtime/mobile-local-inference-gate.d.ts.map +0 -1
- package/src/runtime/voice-entity-binding.d.ts.map +0 -1
- package/src/services/active-model.d.ts.map +0 -1
- package/src/services/assignments.d.ts.map +0 -1
- package/src/services/backend.d.ts.map +0 -1
- package/src/services/bionic-host-loader.d.ts.map +0 -1
- package/src/services/bundled-models.d.ts.map +0 -1
- package/src/services/cache-bridge.d.ts.map +0 -1
- package/src/services/catalog.d.ts +0 -10
- package/src/services/catalog.d.ts.map +0 -1
- package/src/services/checkpoint-client.d.ts.map +0 -1
- package/src/services/cloud-fallback.d.ts.map +0 -1
- package/src/services/conversation-registry.d.ts.map +0 -1
- package/src/services/desktop-fused-ffi-backend-runtime.d.ts.map +0 -1
- package/src/services/device-bridge.d.ts.map +0 -1
- package/src/services/device-resource-metrics.d.ts.map +0 -1
- package/src/services/device-tier.d.ts.map +0 -1
- package/src/services/downloader.d.ts.map +0 -1
- package/src/services/engine.d.ts.map +0 -1
- package/src/services/external-scanner.d.ts.map +0 -1
- package/src/services/ffi-streaming-backend.d.ts.map +0 -1
- package/src/services/ffi-streaming-runner.d.ts.map +0 -1
- package/src/services/gpu-detect.d.ts.map +0 -1
- package/src/services/handler-registry.d.ts.map +0 -1
- package/src/services/hardware.d.ts.map +0 -1
- package/src/services/hf-search.d.ts +0 -26
- package/src/services/hf-search.d.ts.map +0 -1
- package/src/services/hf-search.test.ts +0 -69
- package/src/services/hf-search.ts +0 -420
- package/src/services/image-description-runtime.d.ts.map +0 -1
- package/src/services/imagegen/aosp-unavailable.d.ts.map +0 -1
- package/src/services/imagegen/backend-selector.d.ts.map +0 -1
- package/src/services/imagegen/coreml-unavailable.d.ts.map +0 -1
- package/src/services/imagegen/errors.d.ts.map +0 -1
- package/src/services/imagegen/index.d.ts.map +0 -1
- package/src/services/imagegen/mflux.d.ts.map +0 -1
- package/src/services/imagegen/sd-cpp.d.ts.map +0 -1
- package/src/services/imagegen/tensorrt-unavailable.d.ts.map +0 -1
- package/src/services/imagegen/types.d.ts.map +0 -1
- package/src/services/index.d.ts.map +0 -1
- package/src/services/inference-capabilities.d.ts.map +0 -1
- package/src/services/inference-telemetry.d.ts.map +0 -1
- package/src/services/kv-spill.d.ts.map +0 -1
- package/src/services/latency-trace.d.ts.map +0 -1
- package/src/services/llm-streaming-binding.d.ts.map +0 -1
- package/src/services/load-args.d.ts.map +0 -1
- package/src/services/manifest/index.d.ts +0 -4
- package/src/services/manifest/index.d.ts.map +0 -1
- package/src/services/manifest/schema.d.ts.map +0 -1
- package/src/services/manifest/types.d.ts.map +0 -1
- package/src/services/manifest/validator.d.ts.map +0 -1
- package/src/services/memory-arbiter.d.ts.map +0 -1
- package/src/services/memory-monitor.d.ts.map +0 -1
- package/src/services/memory-pressure.d.ts.map +0 -1
- package/src/services/mtp-doctor.d.ts.map +0 -1
- package/src/services/network-policy.d.ts.map +0 -1
- package/src/services/paths.d.ts.map +0 -1
- package/src/services/planner-skeleton.d.ts.map +0 -1
- package/src/services/providers.d.ts.map +0 -1
- package/src/services/ram-budget.d.ts.map +0 -1
- package/src/services/readiness.d.ts.map +0 -1
- package/src/services/recommendation.d.ts.map +0 -1
- package/src/services/registry.d.ts.map +0 -1
- package/src/services/router-handler.d.ts.map +0 -1
- package/src/services/routing-policy.d.ts.map +0 -1
- package/src/services/routing-preferences.d.ts.map +0 -1
- package/src/services/runtime-target.d.ts.map +0 -1
- package/src/services/service.d.ts.map +0 -1
- package/src/services/session-pool.d.ts.map +0 -1
- package/src/services/structured-output/deterministic-repair.d.ts.map +0 -1
- package/src/services/structured-output.d.ts.map +0 -1
- package/src/services/system-memory.d.ts.map +0 -1
- package/src/services/types.d.ts.map +0 -1
- package/src/services/verify-on-device.d.ts.map +0 -1
- package/src/services/verify.d.ts.map +0 -1
- package/src/services/vision/aosp-unavailable.d.ts.map +0 -1
- package/src/services/vision/capacitor-llama.d.ts.map +0 -1
- package/src/services/vision/cloud-fallback.d.ts.map +0 -1
- package/src/services/vision/hash.d.ts.map +0 -1
- package/src/services/vision/index.d.ts.map +0 -1
- package/src/services/vision/llama-server.d.ts.map +0 -1
- package/src/services/vision/types.d.ts.map +0 -1
- package/src/services/vision/vast-fallback.d.ts.map +0 -1
- package/src/services/vision-embedding-cache.d.ts.map +0 -1
- package/src/services/voice/audio-frame-consumer.d.ts.map +0 -1
- package/src/services/voice/barge-in.d.ts.map +0 -1
- package/src/services/voice/cancellation-coordinator.d.ts.map +0 -1
- package/src/services/voice/checkpoint-manager.d.ts.map +0 -1
- package/src/services/voice/eager-context-builder.d.ts.map +0 -1
- package/src/services/voice/eliza1-eot-scorer.d.ts.map +0 -1
- package/src/services/voice/embedding.d.ts.map +0 -1
- package/src/services/voice/emotion-attribution.d.ts.map +0 -1
- package/src/services/voice/engine-bridge.d.ts.map +0 -1
- package/src/services/voice/eot-classifier-ggml.d.ts.map +0 -1
- package/src/services/voice/eot-classifier.d.ts.map +0 -1
- package/src/services/voice/errors.d.ts.map +0 -1
- package/src/services/voice/expressive-tags.d.ts.map +0 -1
- package/src/services/voice/ffi-bindings.d.ts.map +0 -1
- package/src/services/voice/first-line-cache.d.ts.map +0 -1
- package/src/services/voice/fused-eot-scorer.d.ts.map +0 -1
- package/src/services/voice/index.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-backend.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +0 -1
- package/src/services/voice/kokoro/kokoro-runtime.d.ts.map +0 -1
- package/src/services/voice/kokoro/phonemizer.d.ts.map +0 -1
- package/src/services/voice/kokoro/pick-runtime.d.ts.map +0 -1
- package/src/services/voice/kokoro/runtime-selection.d.ts +0 -92
- package/src/services/voice/kokoro/runtime-selection.d.ts.map +0 -1
- package/src/services/voice/kokoro/types.d.ts.map +0 -1
- package/src/services/voice/kokoro/voice-presets.d.ts.map +0 -1
- package/src/services/voice/kokoro/voices.d.ts.map +0 -1
- package/src/services/voice/lifecycle.d.ts.map +0 -1
- package/src/services/voice/live-diarization-session.d.ts +0 -96
- package/src/services/voice/live-diarization-session.d.ts.map +0 -1
- package/src/services/voice/mic-source.d.ts.map +0 -1
- package/src/services/voice/optimistic-policy.d.ts.map +0 -1
- package/src/services/voice/partial-stabilizer.d.ts.map +0 -1
- package/src/services/voice/phoneme-tokenizer.d.ts.map +0 -1
- package/src/services/voice/phrase-cache.d.ts.map +0 -1
- package/src/services/voice/phrase-chunker.d.ts.map +0 -1
- package/src/services/voice/pipeline-impls.d.ts.map +0 -1
- package/src/services/voice/pipeline.d.ts.map +0 -1
- package/src/services/voice/prefill-client.d.ts.map +0 -1
- package/src/services/voice/prefix-preserving-queue.d.ts.map +0 -1
- package/src/services/voice/profile-store.d.ts.map +0 -1
- package/src/services/voice/ring-buffer.d.ts.map +0 -1
- package/src/services/voice/rollback-queue.d.ts.map +0 -1
- package/src/services/voice/samantha-preset-placeholder.d.ts.map +0 -1
- package/src/services/voice/samantha-preset-regenerator.d.ts.map +0 -1
- package/src/services/voice/scheduler.d.ts.map +0 -1
- package/src/services/voice/shared-resources.d.ts.map +0 -1
- package/src/services/voice/speaker/attribution-pipeline.d.ts.map +0 -1
- package/src/services/voice/speaker/diarizer-fused.d.ts.map +0 -1
- package/src/services/voice/speaker/diarizer.d.ts.map +0 -1
- package/src/services/voice/speaker/encoder-fused.d.ts.map +0 -1
- package/src/services/voice/speaker/encoder-ggml.d.ts.map +0 -1
- package/src/services/voice/speaker/encoder.d.ts.map +0 -1
- package/src/services/voice/speaker-imprint.d.ts.map +0 -1
- package/src/services/voice/speaker-preset-cache.d.ts.map +0 -1
- package/src/services/voice/system-audio-sink.d.ts.map +0 -1
- package/src/services/voice/transcriber.d.ts.map +0 -1
- package/src/services/voice/transcript-knowledge.d.ts.map +0 -1
- package/src/services/voice/transcript-service.d.ts.map +0 -1
- package/src/services/voice/transcript-store.d.ts.map +0 -1
- package/src/services/voice/turn-controller.d.ts.map +0 -1
- package/src/services/voice/types.d.ts.map +0 -1
- package/src/services/voice/vad.d.ts.map +0 -1
- package/src/services/voice/voice-budget.d.ts.map +0 -1
- package/src/services/voice/voice-emotion-classifier.d.ts.map +0 -1
- package/src/services/voice/voice-preset-format.d.ts.map +0 -1
- package/src/services/voice/voice-profile-artifact.d.ts.map +0 -1
- package/src/services/voice/voice-profile-routes.d.ts.map +0 -1
- package/src/services/voice/voice-settings.d.ts +0 -82
- package/src/services/voice/voice-settings.d.ts.map +0 -1
- package/src/services/voice/voice-settings.ts +0 -172
- package/src/services/voice/voice-state-machine.d.ts.map +0 -1
- package/src/services/voice/wake-word-ggml.d.ts.map +0 -1
- package/src/services/voice/wake-word.d.ts.map +0 -1
- package/src/services/voice/wrap-with-first-line-cache.d.ts.map +0 -1
- package/src/services/voice-model-updater.d.ts.map +0 -1
- package/src/services/voice-prewarm.d.ts.map +0 -1
- /package/{src → dist}/actions/generate-media.d.ts +0 -0
- /package/{src → dist}/actions/identify-speaker.d.ts +0 -0
- /package/{src → dist}/actions/transcription-control.d.ts +0 -0
- /package/{src → dist}/index.d.ts +0 -0
- /package/{src → dist}/provider.d.ts +0 -0
- /package/{src → dist}/routes/family-member-route.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-asr-route.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-asr-transcribe.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-compat-routes.d.ts +0 -0
- /package/{src → dist}/routes/local-inference-tts-route.d.ts +0 -0
- /package/{src → dist}/routes/transcript-audio-store.d.ts +0 -0
- /package/{src → dist}/routes/voice-first-run-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-models-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-profile-plugin-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-profiles-management-routes.d.ts +0 -0
- /package/{src → dist}/routes/voice-speaker-profile-routes.d.ts +0 -0
- /package/{src → dist}/runtime/embedding-manager-support.d.ts +0 -0
- /package/{src → dist}/runtime/embedding-presets.d.ts +0 -0
- /package/{src → dist}/runtime/embedding-warmup-policy.d.ts +0 -0
- /package/{src → dist}/services/bundled-models.d.ts +0 -0
- /package/{src → dist}/services/cache-bridge.d.ts +0 -0
- /package/{src → dist}/services/checkpoint-client.d.ts +0 -0
- /package/{src → dist}/services/cloud-fallback.d.ts +0 -0
- /package/{src → dist}/services/conversation-registry.d.ts +0 -0
- /package/{src → dist}/services/device-bridge.d.ts +0 -0
- /package/{src → dist}/services/device-resource-metrics.d.ts +0 -0
- /package/{src → dist}/services/external-scanner.d.ts +0 -0
- /package/{src → dist}/services/gpu-detect.d.ts +0 -0
- /package/{src → dist}/services/handler-registry.d.ts +0 -0
- /package/{src → dist}/services/hardware.d.ts +0 -0
- /package/{src → dist}/services/image-description-runtime.d.ts +0 -0
- /package/{src → dist}/services/imagegen/aosp-unavailable.d.ts +0 -0
- /package/{src → dist}/services/imagegen/backend-selector.d.ts +0 -0
- /package/{src → dist}/services/imagegen/coreml-unavailable.d.ts +0 -0
- /package/{src → dist}/services/imagegen/errors.d.ts +0 -0
- /package/{src → dist}/services/imagegen/index.d.ts +0 -0
- /package/{src → dist}/services/imagegen/mflux.d.ts +0 -0
- /package/{src → dist}/services/imagegen/tensorrt-unavailable.d.ts +0 -0
- /package/{src → dist}/services/imagegen/types.d.ts +0 -0
- /package/{src → dist}/services/inference-capabilities.d.ts +0 -0
- /package/{src → dist}/services/inference-telemetry.d.ts +0 -0
- /package/{src → dist}/services/kv-spill.d.ts +0 -0
- /package/{src → dist}/services/latency-trace.d.ts +0 -0
- /package/{src → dist}/services/llm-streaming-binding.d.ts +0 -0
- /package/{src → dist}/services/load-args.d.ts +0 -0
- /package/{src → dist}/services/manifest/validator.d.ts +0 -0
- /package/{src → dist}/services/memory-pressure.d.ts +0 -0
- /package/{src → dist}/services/mtp-doctor.d.ts +0 -0
- /package/{src → dist}/services/network-policy.d.ts +0 -0
- /package/{src → dist}/services/paths.d.ts +0 -0
- /package/{src → dist}/services/planner-skeleton.d.ts +0 -0
- /package/{src → dist}/services/providers.d.ts +0 -0
- /package/{src → dist}/services/ram-budget.d.ts +0 -0
- /package/{src → dist}/services/readiness.d.ts +0 -0
- /package/{src → dist}/services/recommendation.d.ts +0 -0
- /package/{src → dist}/services/routing-preferences.d.ts +0 -0
- /package/{src → dist}/services/runtime-target.d.ts +0 -0
- /package/{src → dist}/services/session-pool.d.ts +0 -0
- /package/{src → dist}/services/structured-output/deterministic-repair.d.ts +0 -0
- /package/{src → dist}/services/structured-output.d.ts +0 -0
- /package/{src → dist}/services/system-memory.d.ts +0 -0
- /package/{src → dist}/services/verify-on-device.d.ts +0 -0
- /package/{src → dist}/services/verify.d.ts +0 -0
- /package/{src → dist}/services/vision/aosp-unavailable.d.ts +0 -0
- /package/{src → dist}/services/vision/capacitor-llama.d.ts +0 -0
- /package/{src → dist}/services/vision/cloud-fallback.d.ts +0 -0
- /package/{src → dist}/services/vision/hash.d.ts +0 -0
- /package/{src → dist}/services/vision/llama-server.d.ts +0 -0
- /package/{src → dist}/services/vision/vast-fallback.d.ts +0 -0
- /package/{src → dist}/services/voice/barge-in.d.ts +0 -0
- /package/{src → dist}/services/voice/cancellation-coordinator.d.ts +0 -0
- /package/{src → dist}/services/voice/checkpoint-manager.d.ts +0 -0
- /package/{src → dist}/services/voice/eager-context-builder.d.ts +0 -0
- /package/{src → dist}/services/voice/emotion-attribution.d.ts +0 -0
- /package/{src → dist}/services/voice/first-line-cache.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/kokoro-runtime.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/phonemizer.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/types.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/voice-presets.d.ts +0 -0
- /package/{src → dist}/services/voice/kokoro/voices.d.ts +0 -0
- /package/{src → dist}/services/voice/lifecycle.d.ts +0 -0
- /package/{src → dist}/services/voice/optimistic-policy.d.ts +0 -0
- /package/{src → dist}/services/voice/phoneme-tokenizer.d.ts +0 -0
- /package/{src → dist}/services/voice/phrase-cache.d.ts +0 -0
- /package/{src → dist}/services/voice/phrase-chunker.d.ts +0 -0
- /package/{src → dist}/services/voice/pipeline-impls.d.ts +0 -0
- /package/{src → dist}/services/voice/pipeline.d.ts +0 -0
- /package/{src → dist}/services/voice/prefill-client.d.ts +0 -0
- /package/{src → dist}/services/voice/prefix-preserving-queue.d.ts +0 -0
- /package/{src → dist}/services/voice/profile-store.d.ts +0 -0
- /package/{src → dist}/services/voice/ring-buffer.d.ts +0 -0
- /package/{src → dist}/services/voice/rollback-queue.d.ts +0 -0
- /package/{src → dist}/services/voice/samantha-preset-placeholder.d.ts +0 -0
- /package/{src → dist}/services/voice/samantha-preset-regenerator.d.ts +0 -0
- /package/{src → dist}/services/voice/scheduler.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/attribution-pipeline.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/diarizer-fused.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/diarizer.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/encoder-fused.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/encoder-ggml.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker/encoder.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker-imprint.d.ts +0 -0
- /package/{src → dist}/services/voice/speaker-preset-cache.d.ts +0 -0
- /package/{src → dist}/services/voice/system-audio-sink.d.ts +0 -0
- /package/{src → dist}/services/voice/transcript-knowledge.d.ts +0 -0
- /package/{src → dist}/services/voice/turn-controller.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-budget.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-emotion-classifier.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-profile-artifact.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-profile-routes.d.ts +0 -0
- /package/{src → dist}/services/voice/voice-state-machine.d.ts +0 -0
- /package/{src → dist}/services/voice/wake-word.d.ts +0 -0
- /package/{src → dist}/services/voice/wrap-with-first-line-cache.d.ts +0 -0
- /package/{src → dist}/services/voice-model-updater.d.ts +0 -0
- /package/{src → dist}/services/voice-prewarm.d.ts +0 -0
package/src/services/engine.ts
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* `ensure-local-inference-handler.ts`).
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
16
17
|
import path from "node:path";
|
|
17
18
|
import {
|
|
18
19
|
logger,
|
|
@@ -21,6 +22,10 @@ import {
|
|
|
21
22
|
} from "@elizaos/core";
|
|
22
23
|
import { isMobilePlatform } from "@elizaos/shared";
|
|
23
24
|
import type { LocalInferenceLoadArgs } from "./active-model";
|
|
25
|
+
import {
|
|
26
|
+
bundleHasAsrModelFiles,
|
|
27
|
+
readBundleAsrProvenanceBlockers,
|
|
28
|
+
} from "./asr-provenance";
|
|
24
29
|
import { readEffectiveAssignments } from "./assignments";
|
|
25
30
|
import type {
|
|
26
31
|
GenerateArgs as BackendGenerateArgs,
|
|
@@ -40,6 +45,7 @@ import {
|
|
|
40
45
|
} from "./conversation-registry";
|
|
41
46
|
import { desktopFusedFfiBackendRuntime } from "./desktop-fused-ffi-backend-runtime";
|
|
42
47
|
import { FfiStreamingBackend } from "./ffi-streaming-backend";
|
|
48
|
+
import { estimateDecodeTokens, recordDecodeThroughput } from "./live-signals";
|
|
43
49
|
import { MemoryMonitor } from "./memory-monitor";
|
|
44
50
|
import { listInstalledModels } from "./registry";
|
|
45
51
|
import { resolveDefaultPoolSize } from "./session-pool";
|
|
@@ -50,7 +56,6 @@ import {
|
|
|
50
56
|
createKokoroTtsBackend,
|
|
51
57
|
EngineVoiceBridge,
|
|
52
58
|
type EngineVoiceBridgeOptions,
|
|
53
|
-
isOmniVoiceBundleAvailable,
|
|
54
59
|
VoiceStartupError,
|
|
55
60
|
} from "./voice/engine-bridge";
|
|
56
61
|
import type { AsrWordTiming } from "./voice/ffi-bindings";
|
|
@@ -58,7 +63,6 @@ import { resolveKokoroEngineConfig } from "./voice/kokoro/kokoro-engine-discover
|
|
|
58
63
|
import {
|
|
59
64
|
readVoiceBackendModeFromEnv,
|
|
60
65
|
selectVoiceBackend,
|
|
61
|
-
type VoiceBackendChoice,
|
|
62
66
|
} from "./voice/kokoro/runtime-selection";
|
|
63
67
|
import type { VoicePipelineEvents } from "./voice/pipeline";
|
|
64
68
|
import { type MtpTextRunner, mtpTextRunner } from "./voice/pipeline-impls";
|
|
@@ -138,6 +142,9 @@ function skeletonHasFreeStringKey(
|
|
|
138
142
|
const DEFAULT_IDLE_UNLOAD_MS = 15 * 60 * 1000;
|
|
139
143
|
/** How often the idle-unload timer checks the activity clock. */
|
|
140
144
|
const IDLE_UNLOAD_CHECK_INTERVAL_MS = 60 * 1000;
|
|
145
|
+
const BYTES_PER_MIB = 1024 * 1024;
|
|
146
|
+
const GIB_PER_GB = 1024;
|
|
147
|
+
const TEXT_RESIDENT_OVERHEAD_MB = 512;
|
|
141
148
|
|
|
142
149
|
export function resolveIdleUnloadMs(): number {
|
|
143
150
|
const raw = process.env.ELIZA_LOCAL_IDLE_UNLOAD_MS?.trim();
|
|
@@ -178,34 +185,71 @@ export type GenerateArgs = BackendGenerateArgs;
|
|
|
178
185
|
interface ActiveEliza1Bundle {
|
|
179
186
|
root: string;
|
|
180
187
|
tierId: Eliza1TierId;
|
|
181
|
-
voiceBackends?: ReadonlyArray<VoiceBackendChoice>;
|
|
182
188
|
}
|
|
183
189
|
|
|
184
190
|
function resolveActiveEliza1Bundle(
|
|
185
191
|
target: InstalledModel | undefined,
|
|
186
|
-
catalog: ReturnType<typeof findCatalogModel>,
|
|
187
192
|
): ActiveEliza1Bundle | null {
|
|
188
193
|
if (!target?.bundleRoot) return null;
|
|
189
194
|
if (!ELIZA_1_PLACEHOLDER_IDS.has(target.id)) return null;
|
|
190
195
|
return {
|
|
191
196
|
root: target.bundleRoot,
|
|
192
197
|
tierId: target.id as Eliza1TierId,
|
|
193
|
-
voiceBackends: catalog?.voiceBackends,
|
|
194
198
|
};
|
|
195
199
|
}
|
|
196
200
|
|
|
197
201
|
function resolveDirectEliza1Bundle(
|
|
198
202
|
args: LocalInferenceLoadArgs | undefined,
|
|
199
|
-
catalog: ReturnType<typeof findCatalogModel>,
|
|
200
203
|
): ActiveEliza1Bundle | null {
|
|
201
204
|
if (!args?.modelId || !ELIZA_1_PLACEHOLDER_IDS.has(args.modelId)) return null;
|
|
202
205
|
return {
|
|
203
206
|
root: path.dirname(path.dirname(args.modelPath)),
|
|
204
207
|
tierId: args.modelId as Eliza1TierId,
|
|
205
|
-
voiceBackends: catalog?.voiceBackends,
|
|
206
208
|
};
|
|
207
209
|
}
|
|
208
210
|
|
|
211
|
+
function estimateTextResidentMb(
|
|
212
|
+
installed: InstalledModel | undefined,
|
|
213
|
+
catalog: ReturnType<typeof findCatalogModel>,
|
|
214
|
+
): number {
|
|
215
|
+
const installedMb =
|
|
216
|
+
typeof installed?.sizeBytes === "number" && installed.sizeBytes > 0
|
|
217
|
+
? Math.ceil(installed.sizeBytes / BYTES_PER_MIB)
|
|
218
|
+
: 0;
|
|
219
|
+
const catalogMb =
|
|
220
|
+
typeof catalog?.sizeGb === "number" && catalog.sizeGb > 0
|
|
221
|
+
? Math.ceil(catalog.sizeGb * GIB_PER_GB)
|
|
222
|
+
: 0;
|
|
223
|
+
const baseMb = Math.max(installedMb, catalogMb);
|
|
224
|
+
return baseMb > 0 ? baseMb + TEXT_RESIDENT_OVERHEAD_MB : 0;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function stagedLitertModelPath(
|
|
228
|
+
bundleRoot: string,
|
|
229
|
+
modelId: string | undefined,
|
|
230
|
+
): string | undefined {
|
|
231
|
+
const textDir = path.join(bundleRoot, "text");
|
|
232
|
+
if (!existsSync(textDir) || !statSync(textDir).isDirectory()) {
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (modelId?.startsWith("eliza-1-")) {
|
|
237
|
+
const expected = path.join(textDir, `${modelId}.litertlm`);
|
|
238
|
+
if (existsSync(expected) && statSync(expected).isFile()) {
|
|
239
|
+
return expected;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const candidates = readdirSync(textDir)
|
|
244
|
+
.filter((name) => name.endsWith(".litertlm"))
|
|
245
|
+
.sort();
|
|
246
|
+
if (candidates.length === 1) {
|
|
247
|
+
const candidate = path.join(textDir, candidates[0]);
|
|
248
|
+
if (statSync(candidate).isFile()) return candidate;
|
|
249
|
+
}
|
|
250
|
+
return undefined;
|
|
251
|
+
}
|
|
252
|
+
|
|
209
253
|
/**
|
|
210
254
|
* Project a fully-resolved `LocalInferenceLoadArgs` onto the subset that
|
|
211
255
|
* the dispatcher cares about. Keeps `BackendLoadOverrides` framework-free
|
|
@@ -235,6 +279,8 @@ function toBackendLoadOverrides(
|
|
|
235
279
|
const bundleRoot = path.dirname(path.dirname(args.modelPath));
|
|
236
280
|
overrides.bundleRoot = bundleRoot;
|
|
237
281
|
overrides.manifestPath = path.join(bundleRoot, "eliza-1.manifest.json");
|
|
282
|
+
const litertModelPath = stagedLitertModelPath(bundleRoot, args.modelId);
|
|
283
|
+
if (litertModelPath) overrides.litertModelPath = litertModelPath;
|
|
238
284
|
}
|
|
239
285
|
return overrides;
|
|
240
286
|
}
|
|
@@ -256,7 +302,7 @@ export class LocalInferenceEngine {
|
|
|
256
302
|
/**
|
|
257
303
|
* In-process FFI backend — the sole text runtime, served by the FUSED
|
|
258
304
|
* `libelizainference` (`desktop-fused-ffi-backend-runtime.ts`). Text gen,
|
|
259
|
-
*
|
|
305
|
+
* MTP speculative decoding, KV-cache quant, native tokenization,
|
|
260
306
|
* and vision-describe all run through the one fused lib the voice subsystem
|
|
261
307
|
* already loads (ABI v9). libllama has been retired: a fused lib that is
|
|
262
308
|
* absent or lacks the v9 capabilities is a loud `LocalInferenceUnavailable`
|
|
@@ -279,6 +325,7 @@ export class LocalInferenceEngine {
|
|
|
279
325
|
*/
|
|
280
326
|
private voiceBridge: EngineVoiceBridge | null = null;
|
|
281
327
|
private voiceReadyPromise: Promise<EngineVoiceBridge> | null = null;
|
|
328
|
+
private asrReadyPromise: Promise<EngineVoiceBridge> | null = null;
|
|
282
329
|
|
|
283
330
|
/**
|
|
284
331
|
* The general onload/offload coordinator (W10 / J5). One registry per
|
|
@@ -316,6 +363,14 @@ export class LocalInferenceEngine {
|
|
|
316
363
|
private idleUnloadTimer: NodeJS.Timeout | null = null;
|
|
317
364
|
/** Evictable text-target role id registered on `sharedResources`, or null. */
|
|
318
365
|
private textTargetRoleId: string | null = null;
|
|
366
|
+
/**
|
|
367
|
+
* Ids of evictable roles THIS engine registered on `sharedResources`
|
|
368
|
+
* (text-target today). `getResidentFootprintMb()` sums only these so the
|
|
369
|
+
* arbiter never double-counts its own vision/image-gen registry roles.
|
|
370
|
+
*/
|
|
371
|
+
private readonly ownedEvictableRoleIds = new Set<string>();
|
|
372
|
+
/** Best-effort resident footprint for the active text bundle, in MiB. */
|
|
373
|
+
private textTargetEstimatedMb = 0;
|
|
319
374
|
/** Evictable drafter role id registered on `sharedResources`, or null. */
|
|
320
375
|
|
|
321
376
|
/**
|
|
@@ -337,6 +392,28 @@ export class LocalInferenceEngine {
|
|
|
337
392
|
return this.sharedResources;
|
|
338
393
|
}
|
|
339
394
|
|
|
395
|
+
/**
|
|
396
|
+
* Resident RAM footprint (MB) of the model weights this engine owns on the
|
|
397
|
+
* shared registry — the active text/embedding bundle today, plus any future
|
|
398
|
+
* engine-registered role (drafter, voice). This is the term `service.ts`
|
|
399
|
+
* feeds into the `MemoryArbiter` as `externalFootprintMb` so the arbiter's
|
|
400
|
+
* proactive `evictToFit` path accounts for the dominant resident consumer
|
|
401
|
+
* (the text target) instead of seeing only its own vision/image-gen handles
|
|
402
|
+
* and never tripping (#8809 AC#1). Summed by role id so it never
|
|
403
|
+
* double-counts the arbiter's own registry roles (vision/image-gen), which
|
|
404
|
+
* the arbiter already counts in its resident map.
|
|
405
|
+
*/
|
|
406
|
+
getResidentFootprintMb(): number {
|
|
407
|
+
if (this.ownedEvictableRoleIds.size === 0) return 0;
|
|
408
|
+
let mb = 0;
|
|
409
|
+
for (const role of this.sharedResources.evictableRoles()) {
|
|
410
|
+
if (this.ownedEvictableRoleIds.has(role.id)) {
|
|
411
|
+
mb += role.estimatedResidentMb();
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return mb;
|
|
415
|
+
}
|
|
416
|
+
|
|
340
417
|
/** The RAM-pressure monitor. Exposed for diagnostics / tests. */
|
|
341
418
|
getMemoryMonitor(): MemoryMonitor {
|
|
342
419
|
return this.memoryMonitor;
|
|
@@ -372,6 +449,7 @@ export class LocalInferenceEngine {
|
|
|
372
449
|
if (this.textTargetRoleId === null) {
|
|
373
450
|
const role = createEvictableModelRole({
|
|
374
451
|
role: "text-target",
|
|
452
|
+
estimatedMb: this.textTargetEstimatedMb,
|
|
375
453
|
isResident: () => this.hasLoadedModel(),
|
|
376
454
|
evict: async () => {
|
|
377
455
|
// Last thing to go. Evicting the text target = unload it; the
|
|
@@ -381,6 +459,7 @@ export class LocalInferenceEngine {
|
|
|
381
459
|
});
|
|
382
460
|
this.sharedResources.acquire(role);
|
|
383
461
|
this.textTargetRoleId = role.id;
|
|
462
|
+
this.ownedEvictableRoleIds.add(role.id);
|
|
384
463
|
}
|
|
385
464
|
}
|
|
386
465
|
|
|
@@ -390,6 +469,7 @@ export class LocalInferenceEngine {
|
|
|
390
469
|
);
|
|
391
470
|
this.textTargetRoleId = null;
|
|
392
471
|
for (const id of ids) {
|
|
472
|
+
this.ownedEvictableRoleIds.delete(id);
|
|
393
473
|
try {
|
|
394
474
|
await this.sharedResources.release(id);
|
|
395
475
|
} catch {
|
|
@@ -480,7 +560,7 @@ export class LocalInferenceEngine {
|
|
|
480
560
|
return this.dispatcher.hasLoadedModel();
|
|
481
561
|
}
|
|
482
562
|
|
|
483
|
-
activeBackendId(): "
|
|
563
|
+
activeBackendId(): "llama-cpp" | null {
|
|
484
564
|
return this.dispatcher.activeBackendId();
|
|
485
565
|
}
|
|
486
566
|
|
|
@@ -489,23 +569,28 @@ export class LocalInferenceEngine {
|
|
|
489
569
|
return this.dispatcher.currentRuntimeLoadConfig();
|
|
490
570
|
}
|
|
491
571
|
|
|
572
|
+
private async disposeVoiceBridge(bridge: EngineVoiceBridge): Promise<void> {
|
|
573
|
+
try {
|
|
574
|
+
await bridge.disarm();
|
|
575
|
+
await bridge.settle();
|
|
576
|
+
} finally {
|
|
577
|
+
bridge.dispose();
|
|
578
|
+
if (this.voiceBridge === bridge) this.voiceBridge = null;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
|
|
492
582
|
async unload(): Promise<void> {
|
|
493
583
|
// Stop the memory monitor + idle timer and deregister evictable roles
|
|
494
584
|
// before anything else — they reference the model that's about to go.
|
|
495
585
|
await this.stopBackgroundManagement();
|
|
496
586
|
this.activeEliza1Bundle = null;
|
|
587
|
+
this.textTargetEstimatedMb = 0;
|
|
497
588
|
const bridge = this.voiceBridge;
|
|
498
589
|
if (bridge) {
|
|
499
590
|
// Drop voice resources before tearing down text. Disarm is a
|
|
500
591
|
// no-op when the lifecycle is already in voice-off, so this is
|
|
501
592
|
// safe even if the caller never called startVoice().
|
|
502
|
-
|
|
503
|
-
await bridge.disarm();
|
|
504
|
-
await bridge.settle();
|
|
505
|
-
} finally {
|
|
506
|
-
bridge.dispose();
|
|
507
|
-
if (this.voiceBridge === bridge) this.voiceBridge = null;
|
|
508
|
-
}
|
|
593
|
+
await this.disposeVoiceBridge(bridge);
|
|
509
594
|
}
|
|
510
595
|
await this.dispatcher.unload();
|
|
511
596
|
}
|
|
@@ -518,6 +603,7 @@ export class LocalInferenceEngine {
|
|
|
518
603
|
const target = installed.find((m) => m.path === modelPath);
|
|
519
604
|
const modelId = target?.id ?? resolved?.modelId;
|
|
520
605
|
const catalog = modelId ? findCatalogModel(modelId) : undefined;
|
|
606
|
+
this.textTargetEstimatedMb = estimateTextResidentMb(target, catalog);
|
|
521
607
|
|
|
522
608
|
// Resolve the active Eliza-1 bundle (root + tier) so voice setup can
|
|
523
609
|
// find the bundle-relative Kokoro TTS root and the per-tier EOT
|
|
@@ -525,8 +611,7 @@ export class LocalInferenceEngine {
|
|
|
525
611
|
// `bundleRoot` and an `eliza-1-<tier>` id. Reset on every load — a
|
|
526
612
|
// non-Eliza-1 model clears it.
|
|
527
613
|
this.activeEliza1Bundle =
|
|
528
|
-
resolveActiveEliza1Bundle(target
|
|
529
|
-
resolveDirectEliza1Bundle(resolved, catalog);
|
|
614
|
+
resolveActiveEliza1Bundle(target) ?? resolveDirectEliza1Bundle(resolved);
|
|
530
615
|
|
|
531
616
|
// Resolved args (when provided) carry the merged catalog defaults +
|
|
532
617
|
// per-load overrides from the active-model coordinator. Project them
|
|
@@ -543,10 +628,8 @@ export class LocalInferenceEngine {
|
|
|
543
628
|
overrides,
|
|
544
629
|
};
|
|
545
630
|
|
|
546
|
-
// The
|
|
547
|
-
//
|
|
548
|
-
// load failure surfaces directly — there is no second runtime to fall
|
|
549
|
-
// back to.
|
|
631
|
+
// The local stack is Eliza-1 only: the dispatcher routes every load to the
|
|
632
|
+
// fused libelizainference runtime. A load failure surfaces directly.
|
|
550
633
|
await this.dispatcher.load(plan);
|
|
551
634
|
this.startBackgroundManagement();
|
|
552
635
|
}
|
|
@@ -554,7 +637,15 @@ export class LocalInferenceEngine {
|
|
|
554
637
|
async generate(args: GenerateArgs): Promise<string> {
|
|
555
638
|
this.markActivity();
|
|
556
639
|
const streaming = this.voiceStreamingArgs(args);
|
|
640
|
+
const startedAt = Date.now();
|
|
557
641
|
const text = await this.dispatcher.generate(streaming.args);
|
|
642
|
+
// Decode-throughput routing signal. `generate()` returns only text, so the
|
|
643
|
+
// decoded-token count is approximated from the output length (the exact
|
|
644
|
+
// usage block is only available on the `generateInConversation` path).
|
|
645
|
+
recordDecodeThroughput({
|
|
646
|
+
tokens: estimateDecodeTokens(text),
|
|
647
|
+
elapsedMs: Date.now() - startedAt,
|
|
648
|
+
});
|
|
558
649
|
await streaming.finish(text);
|
|
559
650
|
return text;
|
|
560
651
|
}
|
|
@@ -575,6 +666,9 @@ export class LocalInferenceEngine {
|
|
|
575
666
|
maxTokens?: number;
|
|
576
667
|
temperature?: number;
|
|
577
668
|
signal?: AbortSignal;
|
|
669
|
+
/** Per-token callback for streaming vision describe (ABI v13). */
|
|
670
|
+
onTextChunk?: (chunk: string) => void | Promise<void>;
|
|
671
|
+
maxTokensPerStep?: number;
|
|
578
672
|
}): Promise<{
|
|
579
673
|
text: string;
|
|
580
674
|
projectorMs?: number;
|
|
@@ -668,12 +762,25 @@ export class LocalInferenceEngine {
|
|
|
668
762
|
const cacheKey = `conv:${handle.conversationId}`;
|
|
669
763
|
const streaming = this.voiceStreamingArgs(args);
|
|
670
764
|
if (this.activeBackendId() === "llama-cpp") {
|
|
765
|
+
const startedAt = Date.now();
|
|
671
766
|
const result: LocalGenerateWithUsageResult =
|
|
672
767
|
await this.dispatcher.generateWithUsage({
|
|
673
768
|
...streaming.args,
|
|
674
769
|
cacheKey,
|
|
675
770
|
slotId: handle.slotId,
|
|
676
771
|
});
|
|
772
|
+
const elapsedMs = Date.now() - startedAt;
|
|
773
|
+
// Decode-throughput routing signal. Prefer the exact decoded-token count
|
|
774
|
+
// from the backend usage block; estimate from the text only if the
|
|
775
|
+
// backend omitted it.
|
|
776
|
+
const decodedTokens = Number(result.usage?.completion_tokens);
|
|
777
|
+
recordDecodeThroughput({
|
|
778
|
+
tokens:
|
|
779
|
+
Number.isFinite(decodedTokens) && decodedTokens > 0
|
|
780
|
+
? decodedTokens
|
|
781
|
+
: estimateDecodeTokens(result.text),
|
|
782
|
+
elapsedMs,
|
|
783
|
+
});
|
|
677
784
|
await streaming.finish(result.text);
|
|
678
785
|
return {
|
|
679
786
|
text: result.text,
|
|
@@ -857,6 +964,15 @@ export class LocalInferenceEngine {
|
|
|
857
964
|
"[voice] Voice session is already active. Call stopVoice() before starting a new one.",
|
|
858
965
|
);
|
|
859
966
|
}
|
|
967
|
+
if (opts.useFfiBackend && bundleHasAsrModelFiles(opts.bundleRoot)) {
|
|
968
|
+
const blockers = readBundleAsrProvenanceBlockers(opts.bundleRoot);
|
|
969
|
+
if (blockers.length > 0) {
|
|
970
|
+
throw new VoiceStartupError(
|
|
971
|
+
"blocked-asr-provenance",
|
|
972
|
+
`[voice] Cannot start fused local voice: ${blockers.join("; ")}`,
|
|
973
|
+
);
|
|
974
|
+
}
|
|
975
|
+
}
|
|
860
976
|
// Pass the engine's shared-resource registry through so voice ref-counts
|
|
861
977
|
// against the same canonical resources as text and the `MemoryMonitor`
|
|
862
978
|
// sees voice's evictable roles too. The engine's registry is canonical —
|
|
@@ -919,34 +1035,143 @@ export class LocalInferenceEngine {
|
|
|
919
1035
|
}
|
|
920
1036
|
}
|
|
921
1037
|
|
|
1038
|
+
private async activateAssignedBundleForVoice(): Promise<void> {
|
|
1039
|
+
if (this.activeEliza1Bundle || this.dispatcher.hasLoadedModel()) return;
|
|
1040
|
+
try {
|
|
1041
|
+
const assignments = await readEffectiveAssignments();
|
|
1042
|
+
const textModelId = assignments.TEXT_LARGE ?? assignments.TEXT_SMALL;
|
|
1043
|
+
if (!textModelId) return;
|
|
1044
|
+
const installed = await listInstalledModels();
|
|
1045
|
+
const target = installed.find((m) => m.id === textModelId);
|
|
1046
|
+
if (!target) return;
|
|
1047
|
+
logger.info(
|
|
1048
|
+
`[voice] Pre-loading text model ${textModelId} to activate Eliza-1 bundle for voice`,
|
|
1049
|
+
);
|
|
1050
|
+
await this.load(target.path);
|
|
1051
|
+
} catch (err) {
|
|
1052
|
+
logger.warn(
|
|
1053
|
+
`[voice] Failed to pre-load text model for bundle activation: ${
|
|
1054
|
+
err instanceof Error ? err.message : String(err)
|
|
1055
|
+
}`,
|
|
1056
|
+
);
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
private localAsrBlockersForBundle(bundle: ActiveEliza1Bundle): string[] {
|
|
1061
|
+
const blockers: string[] = [];
|
|
1062
|
+
if (!bundleHasAsrModelFiles(bundle.root)) {
|
|
1063
|
+
blockers.push(
|
|
1064
|
+
`files.asr: no ASR model artifacts are staged under ${path.join(
|
|
1065
|
+
bundle.root,
|
|
1066
|
+
"asr",
|
|
1067
|
+
)}`,
|
|
1068
|
+
);
|
|
1069
|
+
}
|
|
1070
|
+
blockers.push(...readBundleAsrProvenanceBlockers(bundle.root));
|
|
1071
|
+
return blockers;
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
private assertLocalAsrEligible(bundle: ActiveEliza1Bundle): void {
|
|
1075
|
+
const blockers = this.localAsrBlockersForBundle(bundle);
|
|
1076
|
+
if (blockers.length === 0) return;
|
|
1077
|
+
const code = blockers.some((blocker) => blocker.startsWith("files.asr:"))
|
|
1078
|
+
? "missing-asr-model"
|
|
1079
|
+
: "blocked-asr-provenance";
|
|
1080
|
+
throw new VoiceStartupError(
|
|
1081
|
+
code,
|
|
1082
|
+
`[voice] Cannot start local Gemma ASR for ${bundle.tierId}: ${blockers.join("; ")}`,
|
|
1083
|
+
);
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
private async assignedLocalAsrBundle(): Promise<ActiveEliza1Bundle | null> {
|
|
1087
|
+
if (this.activeEliza1Bundle) return this.activeEliza1Bundle;
|
|
1088
|
+
const assignments = await readEffectiveAssignments();
|
|
1089
|
+
const modelId =
|
|
1090
|
+
assignments.TRANSCRIPTION ??
|
|
1091
|
+
assignments.TEXT_LARGE ??
|
|
1092
|
+
assignments.TEXT_SMALL;
|
|
1093
|
+
if (!modelId) return null;
|
|
1094
|
+
const installed = await listInstalledModels();
|
|
1095
|
+
const target = installed.find((m) => m.id === modelId);
|
|
1096
|
+
return resolveActiveEliza1Bundle(target);
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
async canTranscribeLocally(): Promise<boolean> {
|
|
1100
|
+
try {
|
|
1101
|
+
const bridge = this.voiceBridge;
|
|
1102
|
+
if (bridge?.asrAvailable) return true;
|
|
1103
|
+
const bundle = await this.assignedLocalAsrBundle();
|
|
1104
|
+
return (
|
|
1105
|
+
bundle !== null && this.localAsrBlockersForBundle(bundle).length === 0
|
|
1106
|
+
);
|
|
1107
|
+
} catch (err) {
|
|
1108
|
+
logger.warn(
|
|
1109
|
+
`[voice] Local ASR readiness check failed: ${
|
|
1110
|
+
err instanceof Error ? err.message : String(err)
|
|
1111
|
+
}`,
|
|
1112
|
+
);
|
|
1113
|
+
return false;
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
async ensureActiveBundleAsrReady(): Promise<EngineVoiceBridge> {
|
|
1118
|
+
if (this.asrReadyPromise) return this.asrReadyPromise;
|
|
1119
|
+
this.asrReadyPromise = this.ensureActiveBundleAsrReadyOnce();
|
|
1120
|
+
try {
|
|
1121
|
+
return await this.asrReadyPromise;
|
|
1122
|
+
} finally {
|
|
1123
|
+
this.asrReadyPromise = null;
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
private async ensureActiveBundleAsrReadyOnce(): Promise<EngineVoiceBridge> {
|
|
1128
|
+
await this.activateAssignedBundleForVoice();
|
|
1129
|
+
const bundle = this.activeEliza1Bundle;
|
|
1130
|
+
if (!bundle) {
|
|
1131
|
+
throw new VoiceStartupError(
|
|
1132
|
+
"missing-bundle-root",
|
|
1133
|
+
"[voice] Cannot start local ASR: no active Eliza-1 bundle is loaded. Install and activate a Gemma ASR-capable Eliza-1 bundle.",
|
|
1134
|
+
);
|
|
1135
|
+
}
|
|
1136
|
+
this.assertLocalAsrEligible(bundle);
|
|
1137
|
+
|
|
1138
|
+
let bridge = this.voiceBridge;
|
|
1139
|
+
if (bridge?.asrAvailable) {
|
|
1140
|
+
await bridge.arm();
|
|
1141
|
+
return bridge;
|
|
1142
|
+
}
|
|
1143
|
+
if (bridge) {
|
|
1144
|
+
await this.disposeVoiceBridge(bridge);
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
const bundleKokoroRoot = path.join(bundle.root, "tts", "kokoro");
|
|
1148
|
+
const kokoro =
|
|
1149
|
+
resolveKokoroEngineConfig(bundleKokoroRoot) ??
|
|
1150
|
+
resolveKokoroEngineConfig();
|
|
1151
|
+
const kokoroOverrides = kokoro
|
|
1152
|
+
? {
|
|
1153
|
+
ttsBackendOverride: createKokoroTtsBackend(kokoro, {
|
|
1154
|
+
bundleRoot: bundle.root,
|
|
1155
|
+
}),
|
|
1156
|
+
speakerPresetOverride: createKokoroSpeakerPreset(kokoro),
|
|
1157
|
+
}
|
|
1158
|
+
: {};
|
|
1159
|
+
bridge = this.startVoice({
|
|
1160
|
+
bundleRoot: bundle.root,
|
|
1161
|
+
useFfiBackend: true,
|
|
1162
|
+
...kokoroOverrides,
|
|
1163
|
+
});
|
|
1164
|
+
await bridge.arm();
|
|
1165
|
+
return bridge;
|
|
1166
|
+
}
|
|
1167
|
+
|
|
922
1168
|
private async ensureActiveBundleVoiceReadyOnce(): Promise<EngineVoiceBridge> {
|
|
923
1169
|
let bridge = this.voiceBridge;
|
|
924
1170
|
if (!bridge) {
|
|
925
1171
|
// If no text model is loaded yet, try to load the assigned one so
|
|
926
1172
|
// the Eliza-1 bundle activates before voice needs it. This covers
|
|
927
1173
|
// the boot-time warmup race where TTS fires before any text request.
|
|
928
|
-
|
|
929
|
-
try {
|
|
930
|
-
const assignments = await readEffectiveAssignments();
|
|
931
|
-
const textModelId = assignments.TEXT_LARGE ?? assignments.TEXT_SMALL;
|
|
932
|
-
if (textModelId) {
|
|
933
|
-
const installed = await listInstalledModels();
|
|
934
|
-
const target = installed.find((m) => m.id === textModelId);
|
|
935
|
-
if (target) {
|
|
936
|
-
logger.info(
|
|
937
|
-
`[voice] Pre-loading text model ${textModelId} to activate Eliza-1 bundle for voice`,
|
|
938
|
-
);
|
|
939
|
-
await this.load(target.path);
|
|
940
|
-
}
|
|
941
|
-
}
|
|
942
|
-
} catch (err) {
|
|
943
|
-
logger.warn(
|
|
944
|
-
`[voice] Failed to pre-load text model for bundle activation: ${
|
|
945
|
-
err instanceof Error ? err.message : String(err)
|
|
946
|
-
}`,
|
|
947
|
-
);
|
|
948
|
-
}
|
|
949
|
-
}
|
|
1174
|
+
await this.activateAssignedBundleForVoice();
|
|
950
1175
|
const bundle = this.activeEliza1Bundle;
|
|
951
1176
|
if (bundle) {
|
|
952
1177
|
const bundleKokoroRoot = path.join(bundle.root, "tts", "kokoro");
|
|
@@ -958,67 +1183,21 @@ export class LocalInferenceEngine {
|
|
|
958
1183
|
mode,
|
|
959
1184
|
mobile: isMobilePlatform(),
|
|
960
1185
|
kokoroAvailable: kokoro !== null,
|
|
961
|
-
omnivoiceAvailable: isOmniVoiceBundleAvailable(bundle.root),
|
|
962
|
-
tierVoiceBackends: bundle.voiceBackends,
|
|
963
1186
|
});
|
|
964
|
-
|
|
1187
|
+
logger.info(
|
|
965
1188
|
`[voice] Selected ${decision.backend} backend for ${bundle.tierId}: ${decision.reason}`,
|
|
966
1189
|
);
|
|
967
|
-
if (
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
"[voice] Kokoro was selected but its model artifacts are not staged under <stateDir>/local-inference/models/kokoro/.",
|
|
972
|
-
);
|
|
973
|
-
}
|
|
974
|
-
bridge = this.startVoice({
|
|
975
|
-
bundleRoot: "",
|
|
976
|
-
useFfiBackend: false,
|
|
977
|
-
kokoroOnly: kokoro,
|
|
978
|
-
});
|
|
979
|
-
} else {
|
|
980
|
-
const { ensureSamanthaPresetReady } = await import(
|
|
981
|
-
"./voice/samantha-preset-regenerator"
|
|
1190
|
+
if (!kokoro) {
|
|
1191
|
+
throw new VoiceStartupError(
|
|
1192
|
+
"missing-bundle-root",
|
|
1193
|
+
"[voice] Kokoro was selected but its model artifacts are not staged under <stateDir>/local-inference/models/kokoro/.",
|
|
982
1194
|
);
|
|
983
|
-
const outcome = await ensureSamanthaPresetReady(bundle.root);
|
|
984
|
-
if (outcome.kind === "regenerated") {
|
|
985
|
-
logger.info(
|
|
986
|
-
`[voice] regenerated Samantha preset on first boot: ${outcome.bytes} bytes (K=${outcome.K}, refT=${outcome.refT})`,
|
|
987
|
-
);
|
|
988
|
-
} else if (outcome.kind === "placeholder-no-regen") {
|
|
989
|
-
logger.warn(
|
|
990
|
-
`[voice] Samantha preset is the I-wave placeholder and on-the-fly regen is unavailable (reason=${outcome.reason}, detail=${outcome.detail}). Run packages/training/scripts/voice/samantha_lora/RUNBOOK.md or plugins/plugin-local-inference/scripts/regenerate-samantha-preset.mjs to produce a real preset.`,
|
|
991
|
-
);
|
|
992
|
-
if (
|
|
993
|
-
mode !== "omnivoice" &&
|
|
994
|
-
kokoro &&
|
|
995
|
-
bundle.voiceBackends?.includes("kokoro")
|
|
996
|
-
) {
|
|
997
|
-
logger.warn(
|
|
998
|
-
`[voice] Falling back to bundled Kokoro voice ${kokoro.defaultVoiceId} from ${kokoro.layout.root} because OmniVoice has only the placeholder Samantha preset.`,
|
|
999
|
-
);
|
|
1000
|
-
bridge = this.startVoice({
|
|
1001
|
-
bundleRoot: bundle.root,
|
|
1002
|
-
useFfiBackend: true,
|
|
1003
|
-
speakerPresetOverride: createKokoroSpeakerPreset(kokoro),
|
|
1004
|
-
ttsBackendOverride: createKokoroTtsBackend(kokoro, {
|
|
1005
|
-
bundleRoot: bundle.root,
|
|
1006
|
-
}),
|
|
1007
|
-
});
|
|
1008
|
-
} else if (mode !== "omnivoice") {
|
|
1009
|
-
throw new VoiceStartupError(
|
|
1010
|
-
"missing-speaker-preset",
|
|
1011
|
-
`[voice] OmniVoice selected for ${bundle.tierId}, but its Samantha preset is still the placeholder and no bundle-supported Kokoro fallback is staged. ${outcome.detail}`,
|
|
1012
|
-
);
|
|
1013
|
-
}
|
|
1014
|
-
}
|
|
1015
|
-
if (!bridge) {
|
|
1016
|
-
bridge = this.startVoice({
|
|
1017
|
-
bundleRoot: bundle.root,
|
|
1018
|
-
useFfiBackend: true,
|
|
1019
|
-
});
|
|
1020
|
-
}
|
|
1021
1195
|
}
|
|
1196
|
+
bridge = this.startVoice({
|
|
1197
|
+
bundleRoot: "",
|
|
1198
|
+
useFfiBackend: false,
|
|
1199
|
+
kokoroOnly: kokoro,
|
|
1200
|
+
});
|
|
1022
1201
|
} else {
|
|
1023
1202
|
// No Eliza-1 bundle. Fall back to the Kokoro-only path when its
|
|
1024
1203
|
// artifacts are staged. No silent degrade: when both are absent
|
|
@@ -1086,7 +1265,7 @@ export class LocalInferenceEngine {
|
|
|
1086
1265
|
/**
|
|
1087
1266
|
* Use the already-loaded eliza-1 text model as the EOT classifier — see
|
|
1088
1267
|
* `voice/eliza1-eot-scorer.ts`. When set, the runtime skips the
|
|
1089
|
-
* separate LiveKit/Turnsense ONNX and reads P(
|
|
1268
|
+
* separate LiveKit/Turnsense ONNX and reads P(`<end_of_turn>`) directly
|
|
1090
1269
|
* off the live model.
|
|
1091
1270
|
*
|
|
1092
1271
|
* `"auto"` (default): use eliza-1 EOT when `ELIZA_VOICE_EOT_BACKEND=eliza-1`
|
|
@@ -1197,7 +1376,7 @@ export class LocalInferenceEngine {
|
|
|
1197
1376
|
// Voice Wave 2 (2026-05-14): tier-aware turn-detector revision selection.
|
|
1198
1377
|
// `2b` (the entry tier) ships the ~66 MB EN-only SmolLM2-135M distill
|
|
1199
1378
|
// (`v1.2.2-en`); `4b`+ ship the ~396 MB multilingual pruned
|
|
1200
|
-
//
|
|
1379
|
+
// semantic detector (`v0.4.1-intl`). The on-disk layout is per-tier so the
|
|
1201
1380
|
// bundle dir already contains the matching ONNX — `revision` here is a
|
|
1202
1381
|
// telemetry label (the upstream tag the bundle was staged from). When no
|
|
1203
1382
|
// active bundle is resolvable we omit the hint and the resolver falls
|
|
@@ -1225,7 +1404,7 @@ export class LocalInferenceEngine {
|
|
|
1225
1404
|
}
|
|
1226
1405
|
// Fused end-of-turn scorer (ABI v11): the model-based turn detector now
|
|
1227
1406
|
// runs in-process through libelizainference — a composite of the fused
|
|
1228
|
-
// semantic scorer (P(
|
|
1407
|
+
// semantic scorer (P(<end_of_turn>) over the loaded text model) and the
|
|
1229
1408
|
// heuristic syntactic co-signal. Built only when the loaded fused build
|
|
1230
1409
|
// wires the v11 EOT symbol; null on a pre-v11 library, in which case the
|
|
1231
1410
|
// resolver falls through to the heuristic-only classifier.
|
|
@@ -1524,6 +1703,7 @@ export class LocalInferenceEngine {
|
|
|
1524
1703
|
async transcribePcm(
|
|
1525
1704
|
args: TranscriptionAudio,
|
|
1526
1705
|
signal?: AbortSignal,
|
|
1706
|
+
onPartial?: (delta: string) => void,
|
|
1527
1707
|
): Promise<string> {
|
|
1528
1708
|
this.markActivity();
|
|
1529
1709
|
if (signal?.aborted) {
|
|
@@ -1533,7 +1713,7 @@ export class LocalInferenceEngine {
|
|
|
1533
1713
|
}
|
|
1534
1714
|
const transcript = await this.requireVoiceBridge(
|
|
1535
1715
|
"transcribe audio",
|
|
1536
|
-
).transcribePcm(args, signal);
|
|
1716
|
+
).transcribePcm(args, signal, onPartial);
|
|
1537
1717
|
if (signal?.aborted) {
|
|
1538
1718
|
throw signal.reason instanceof Error
|
|
1539
1719
|
? signal.reason
|
|
@@ -1570,6 +1750,13 @@ export class LocalInferenceEngine {
|
|
|
1570
1750
|
* {@link MtpTextRunner}. When omitted, the active local dispatcher is
|
|
1571
1751
|
* used.
|
|
1572
1752
|
*
|
|
1753
|
+
* Production caller: the on-device device bridge, via `runDeviceVoiceTurn`
|
|
1754
|
+
* (`adapters/capacitor-llama/voice-turn.ts`), which wraps the loaded
|
|
1755
|
+
* `CapacitorLlamaContext` in an `MtpTextRunner` and passes it here so the
|
|
1756
|
+
* draft/verify loop runs on the on-device text model. The native mic
|
|
1757
|
+
* capture hands `runDeviceVoiceTurn` the PCM; everything downstream is
|
|
1758
|
+
* in-process JS + the fused FFI (no HTTP, no second voice path).
|
|
1759
|
+
*
|
|
1573
1760
|
* Resolves with the turn's exit reason (`done` / `token-cap` /
|
|
1574
1761
|
* `cancelled`). A missing ASR region in voice mode surfaces as a
|
|
1575
1762
|
* `VoiceStartupError` — no silent cloud fallback (AGENTS.md §3).
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* settings UI / a CLI.
|
|
13
13
|
*
|
|
14
14
|
* Today every Eliza-1 tier ships every component (text + voice + asr +
|
|
15
|
-
* embedding +
|
|
15
|
+
* embedding + embedded-draft-head MTP metadata + cache) as one HuggingFace bundle. The
|
|
16
16
|
* orchestrator picks a tier per artifact kind (always the same tier today —
|
|
17
17
|
* tier resolution is centralised on the recommender) and triggers parallel
|
|
18
18
|
* `service.startDownload(modelId)` calls per kind. The downloader is
|
|
@@ -406,11 +406,14 @@ export function detectMobileCapabilities(
|
|
|
406
406
|
// ttsStreamSupported(). Cast to unknown to peek at the full binding if
|
|
407
407
|
// it happens to be the fused omnivoice build — but don't fail if it
|
|
408
408
|
// isn't; omnivoiceStreaming gracefully defaults to false.
|
|
409
|
-
const anyFfi = ffi as
|
|
409
|
+
const anyFfi = ffi as FfiLlmStreamingAbi & {
|
|
410
|
+
llmStreamSupported?: () => boolean;
|
|
411
|
+
ttsStreamSupported?: () => boolean;
|
|
412
|
+
};
|
|
410
413
|
|
|
411
414
|
const streamingLlm =
|
|
412
415
|
typeof anyFfi.llmStreamSupported === "function"
|
|
413
|
-
?
|
|
416
|
+
? anyFfi.llmStreamSupported()
|
|
414
417
|
: // If the binding doesn't expose a supported() query but was handed
|
|
415
418
|
// to us at all, assume yes — the caller already verified the symbols
|
|
416
419
|
// exist via `llmStreamOpen !== undefined` elsewhere.
|
|
@@ -418,7 +421,7 @@ export function detectMobileCapabilities(
|
|
|
418
421
|
|
|
419
422
|
const omnivoiceStreaming =
|
|
420
423
|
typeof anyFfi.ttsStreamSupported === "function"
|
|
421
|
-
?
|
|
424
|
+
? anyFfi.ttsStreamSupported()
|
|
422
425
|
: false;
|
|
423
426
|
|
|
424
427
|
// mtpSupported requires a drafter bundle probe that is not part of
|