@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
|
@@ -2,17 +2,22 @@ import type { IAgentRuntime } from "@elizaos/core";
|
|
|
2
2
|
import { describe, expect, it } from "vitest";
|
|
3
3
|
import { classifyDeviceTier, type DeviceTierAssessment } from "./device-tier";
|
|
4
4
|
import type { HandlerRegistration } from "./handler-registry";
|
|
5
|
+
import type { LiveDeviceSignals } from "./live-signals";
|
|
5
6
|
import { policyEngine } from "./routing-policy";
|
|
6
|
-
import type { HardwareProbe } from "./types";
|
|
7
|
+
import type { AgentModelSlot, HardwareProbe } from "./types";
|
|
7
8
|
|
|
8
9
|
const noopHandler: HandlerRegistration["handler"] = async (
|
|
9
10
|
_runtime: IAgentRuntime,
|
|
10
11
|
_params: Record<string, unknown>,
|
|
11
12
|
) => null;
|
|
12
13
|
|
|
13
|
-
function registration(
|
|
14
|
+
function registration(
|
|
15
|
+
provider: string,
|
|
16
|
+
priority: number,
|
|
17
|
+
modelType = "TEXT_LARGE",
|
|
18
|
+
): HandlerRegistration {
|
|
14
19
|
return {
|
|
15
|
-
modelType
|
|
20
|
+
modelType,
|
|
16
21
|
provider,
|
|
17
22
|
priority,
|
|
18
23
|
registeredAt: "test",
|
|
@@ -41,7 +46,7 @@ const strongDevice: DeviceTierAssessment = classifyDeviceTier({
|
|
|
41
46
|
cpuCores: 16,
|
|
42
47
|
});
|
|
43
48
|
|
|
44
|
-
// A 4 GB
|
|
49
|
+
// A 4 GB box → POOR tier, mode "cloud-only".
|
|
45
50
|
const weakDevice: DeviceTierAssessment = classifyDeviceTier({
|
|
46
51
|
...baseProbe,
|
|
47
52
|
totalRamGb: 4,
|
|
@@ -49,71 +54,252 @@ const weakDevice: DeviceTierAssessment = classifyDeviceTier({
|
|
|
49
54
|
cpuCores: 2,
|
|
50
55
|
});
|
|
51
56
|
|
|
52
|
-
|
|
53
|
-
|
|
57
|
+
// An OKAY desktop: enough to run a local LM but NOT the local voice stack.
|
|
58
|
+
// canRunLocalLm = true, canRunLocalVoice = false, recommendedMode = "local".
|
|
59
|
+
const okayDesktop: DeviceTierAssessment = classifyDeviceTier({
|
|
60
|
+
...baseProbe,
|
|
61
|
+
totalRamGb: 16,
|
|
62
|
+
freeRamGb: 6,
|
|
63
|
+
cpuCores: 8,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const NO_LIVE_DEMOTION: LiveDeviceSignals = {
|
|
67
|
+
thermalState: "nominal",
|
|
68
|
+
decodeTokensPerSecond: 40,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
function pickAuto(args: {
|
|
72
|
+
slot?: AgentModelSlot;
|
|
73
|
+
modelType?: string;
|
|
74
|
+
candidates: HandlerRegistration[];
|
|
75
|
+
deviceTier?: DeviceTierAssessment | null;
|
|
76
|
+
liveSignals?: LiveDeviceSignals | null;
|
|
77
|
+
}): HandlerRegistration | null {
|
|
78
|
+
return policyEngine.pickProvider({
|
|
79
|
+
modelType: args.modelType ?? "TEXT_LARGE",
|
|
80
|
+
policy: "auto",
|
|
81
|
+
preferredProvider: null,
|
|
82
|
+
candidates: args.candidates,
|
|
83
|
+
selfProvider: "eliza-router",
|
|
84
|
+
slot: args.slot,
|
|
85
|
+
deviceTier: args.deviceTier,
|
|
86
|
+
liveSignals: args.liveSignals,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
describe("PolicyEngine — auto policy (static tier)", () => {
|
|
91
|
+
it("classifier sanity: strong favours local, weak does not, OKAY desktop splits", () => {
|
|
54
92
|
expect(strongDevice.tier).toBe("MAX");
|
|
55
93
|
expect(strongDevice.recommendedMode).toBe("local");
|
|
56
94
|
expect(strongDevice.canRunLocalLm).toBe(true);
|
|
95
|
+
expect(strongDevice.canRunLocalVoice).toBe(true);
|
|
96
|
+
|
|
57
97
|
expect(weakDevice.tier).toBe("POOR");
|
|
58
98
|
expect(weakDevice.canRunLocalLm).toBe(false);
|
|
99
|
+
|
|
100
|
+
expect(okayDesktop.tier).toBe("OKAY");
|
|
101
|
+
expect(okayDesktop.recommendedMode).toBe("local");
|
|
102
|
+
expect(okayDesktop.canRunLocalLm).toBe(true);
|
|
103
|
+
expect(okayDesktop.canRunLocalVoice).toBe(false);
|
|
59
104
|
});
|
|
60
105
|
|
|
61
106
|
it("routes a strong device to the local provider", () => {
|
|
62
|
-
const pick =
|
|
63
|
-
|
|
64
|
-
policy: "auto",
|
|
65
|
-
preferredProvider: null,
|
|
107
|
+
const pick = pickAuto({
|
|
108
|
+
slot: "TEXT_LARGE",
|
|
66
109
|
candidates: [
|
|
67
110
|
registration("eliza-local-inference", -100),
|
|
68
111
|
registration("anthropic", 0),
|
|
69
112
|
],
|
|
70
|
-
selfProvider: "eliza-router",
|
|
71
113
|
deviceTier: strongDevice,
|
|
114
|
+
liveSignals: NO_LIVE_DEMOTION,
|
|
72
115
|
});
|
|
73
116
|
expect(pick?.provider).toBe("eliza-local-inference");
|
|
74
117
|
});
|
|
75
118
|
|
|
76
119
|
it("routes a weak device to the highest-priority cloud provider", () => {
|
|
77
|
-
const pick =
|
|
78
|
-
|
|
79
|
-
policy: "auto",
|
|
80
|
-
preferredProvider: null,
|
|
120
|
+
const pick = pickAuto({
|
|
121
|
+
slot: "TEXT_LARGE",
|
|
81
122
|
candidates: [
|
|
82
123
|
registration("eliza-local-inference", -100),
|
|
83
124
|
registration("anthropic", 0),
|
|
84
125
|
registration("elizacloud", 50),
|
|
85
126
|
],
|
|
86
|
-
selfProvider: "eliza-router",
|
|
87
127
|
deviceTier: weakDevice,
|
|
88
128
|
});
|
|
89
129
|
expect(pick?.provider).toBe("elizacloud");
|
|
90
130
|
});
|
|
91
131
|
|
|
92
132
|
it("falls back to cloud when no device assessment is available", () => {
|
|
133
|
+
const pick = pickAuto({
|
|
134
|
+
slot: "TEXT_LARGE",
|
|
135
|
+
candidates: [
|
|
136
|
+
registration("eliza-local-inference", -100),
|
|
137
|
+
registration("anthropic", 0),
|
|
138
|
+
],
|
|
139
|
+
deviceTier: null,
|
|
140
|
+
});
|
|
141
|
+
expect(pick?.provider).toBe("anthropic");
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it("uses the only available provider even if it is local on a weak device", () => {
|
|
145
|
+
const pick = pickAuto({
|
|
146
|
+
slot: "TEXT_LARGE",
|
|
147
|
+
candidates: [registration("eliza-local-inference", -100)],
|
|
148
|
+
deviceTier: weakDevice,
|
|
149
|
+
});
|
|
150
|
+
expect(pick?.provider).toBe("eliza-local-inference");
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
describe("PolicyEngine — auto policy AC3 live-signal demotion", () => {
|
|
155
|
+
const candidates = () => [
|
|
156
|
+
registration("eliza-local-inference", -100),
|
|
157
|
+
registration("anthropic", 0),
|
|
158
|
+
];
|
|
159
|
+
|
|
160
|
+
it("demotes a strong device to cloud under SERIOUS thermal throttling", () => {
|
|
161
|
+
const pick = pickAuto({
|
|
162
|
+
slot: "TEXT_LARGE",
|
|
163
|
+
candidates: candidates(),
|
|
164
|
+
deviceTier: strongDevice,
|
|
165
|
+
liveSignals: { thermalState: "serious", decodeTokensPerSecond: 40 },
|
|
166
|
+
});
|
|
167
|
+
expect(pick?.provider).toBe("anthropic");
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it("demotes a strong device to cloud under CRITICAL thermal throttling", () => {
|
|
171
|
+
const pick = pickAuto({
|
|
172
|
+
slot: "TEXT_LARGE",
|
|
173
|
+
candidates: candidates(),
|
|
174
|
+
deviceTier: strongDevice,
|
|
175
|
+
liveSignals: { thermalState: "critical", decodeTokensPerSecond: 40 },
|
|
176
|
+
});
|
|
177
|
+
expect(pick?.provider).toBe("anthropic");
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it("demotes a strong device to cloud when decode TPS is below budget", () => {
|
|
181
|
+
const pick = pickAuto({
|
|
182
|
+
slot: "TEXT_LARGE",
|
|
183
|
+
candidates: candidates(),
|
|
184
|
+
deviceTier: strongDevice,
|
|
185
|
+
liveSignals: { thermalState: "nominal", decodeTokensPerSecond: 2 },
|
|
186
|
+
});
|
|
187
|
+
expect(pick?.provider).toBe("anthropic");
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it("does NOT demote on fair thermal + healthy TPS", () => {
|
|
191
|
+
const pick = pickAuto({
|
|
192
|
+
slot: "TEXT_LARGE",
|
|
193
|
+
candidates: candidates(),
|
|
194
|
+
deviceTier: strongDevice,
|
|
195
|
+
liveSignals: { thermalState: "fair", decodeTokensPerSecond: 40 },
|
|
196
|
+
});
|
|
197
|
+
expect(pick?.provider).toBe("eliza-local-inference");
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it("does NOT demote when live signals are unmeasured (null)", () => {
|
|
201
|
+
const pick = pickAuto({
|
|
202
|
+
slot: "TEXT_LARGE",
|
|
203
|
+
candidates: candidates(),
|
|
204
|
+
deviceTier: strongDevice,
|
|
205
|
+
liveSignals: { thermalState: null, decodeTokensPerSecond: null },
|
|
206
|
+
});
|
|
207
|
+
expect(pick?.provider).toBe("eliza-local-inference");
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
describe("PolicyEngine — auto policy AC4 per-modality independence", () => {
|
|
212
|
+
it("one OKAY-desktop assessment yields local TEXT_LARGE + cloud TEXT_TO_SPEECH", () => {
|
|
213
|
+
const textPick = pickAuto({
|
|
214
|
+
slot: "TEXT_LARGE",
|
|
215
|
+
modelType: "TEXT_LARGE",
|
|
216
|
+
candidates: [
|
|
217
|
+
registration("eliza-local-inference", -100, "TEXT_LARGE"),
|
|
218
|
+
registration("anthropic", 0, "TEXT_LARGE"),
|
|
219
|
+
],
|
|
220
|
+
deviceTier: okayDesktop,
|
|
221
|
+
liveSignals: NO_LIVE_DEMOTION,
|
|
222
|
+
});
|
|
223
|
+
const voicePick = pickAuto({
|
|
224
|
+
slot: "TEXT_TO_SPEECH",
|
|
225
|
+
modelType: "TEXT_TO_SPEECH",
|
|
226
|
+
candidates: [
|
|
227
|
+
registration("eliza-local-inference", -100, "TEXT_TO_SPEECH"),
|
|
228
|
+
registration("elizacloud", 50, "TEXT_TO_SPEECH"),
|
|
229
|
+
],
|
|
230
|
+
deviceTier: okayDesktop,
|
|
231
|
+
liveSignals: NO_LIVE_DEMOTION,
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
// Same device, same instant — text stays on-device, voice goes to cloud.
|
|
235
|
+
expect(textPick?.provider).toBe("eliza-local-inference");
|
|
236
|
+
expect(voicePick?.provider).toBe("elizacloud");
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it("TRANSCRIPTION (voice slot) also routes to cloud on OKAY desktop", () => {
|
|
240
|
+
const pick = pickAuto({
|
|
241
|
+
slot: "TRANSCRIPTION",
|
|
242
|
+
modelType: "TRANSCRIPTION",
|
|
243
|
+
candidates: [
|
|
244
|
+
registration("eliza-local-inference", -100, "TRANSCRIPTION"),
|
|
245
|
+
registration("elizacloud", 50, "TRANSCRIPTION"),
|
|
246
|
+
],
|
|
247
|
+
deviceTier: okayDesktop,
|
|
248
|
+
liveSignals: NO_LIVE_DEMOTION,
|
|
249
|
+
});
|
|
250
|
+
expect(pick?.provider).toBe("elizacloud");
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
describe("PolicyEngine — local-only / cloud-only (AC2)", () => {
|
|
255
|
+
it("local-only always returns the local provider, never cloud", () => {
|
|
93
256
|
const pick = policyEngine.pickProvider({
|
|
94
257
|
modelType: "TEXT_LARGE",
|
|
95
|
-
policy: "
|
|
258
|
+
policy: "local-only",
|
|
96
259
|
preferredProvider: null,
|
|
97
260
|
candidates: [
|
|
98
261
|
registration("eliza-local-inference", -100),
|
|
262
|
+
registration("anthropic", 999),
|
|
263
|
+
],
|
|
264
|
+
selfProvider: "eliza-router",
|
|
265
|
+
});
|
|
266
|
+
expect(pick?.provider).toBe("eliza-local-inference");
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
it("local-only returns null when no local handler exists (no silent cloud fallback)", () => {
|
|
270
|
+
const pick = policyEngine.pickProvider({
|
|
271
|
+
modelType: "TEXT_LARGE",
|
|
272
|
+
policy: "local-only",
|
|
273
|
+
preferredProvider: null,
|
|
274
|
+
candidates: [registration("anthropic", 0)],
|
|
275
|
+
selfProvider: "eliza-router",
|
|
276
|
+
});
|
|
277
|
+
expect(pick).toBeNull();
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
it("cloud-only always returns a cloud provider, never local", () => {
|
|
281
|
+
const pick = policyEngine.pickProvider({
|
|
282
|
+
modelType: "TEXT_LARGE",
|
|
283
|
+
policy: "cloud-only",
|
|
284
|
+
preferredProvider: null,
|
|
285
|
+
candidates: [
|
|
286
|
+
registration("eliza-local-inference", 999),
|
|
99
287
|
registration("anthropic", 0),
|
|
100
288
|
],
|
|
101
289
|
selfProvider: "eliza-router",
|
|
102
|
-
deviceTier: null,
|
|
103
290
|
});
|
|
104
291
|
expect(pick?.provider).toBe("anthropic");
|
|
105
292
|
});
|
|
106
293
|
|
|
107
|
-
it("
|
|
294
|
+
it("cloud-only returns null when only local handlers exist", () => {
|
|
108
295
|
const pick = policyEngine.pickProvider({
|
|
109
296
|
modelType: "TEXT_LARGE",
|
|
110
|
-
policy: "
|
|
297
|
+
policy: "cloud-only",
|
|
111
298
|
preferredProvider: null,
|
|
112
|
-
candidates: [registration("eliza-local-inference",
|
|
299
|
+
candidates: [registration("eliza-local-inference", 0)],
|
|
113
300
|
selfProvider: "eliza-router",
|
|
114
|
-
deviceTier: weakDevice,
|
|
115
301
|
});
|
|
116
|
-
expect(pick
|
|
302
|
+
expect(pick).toBeNull();
|
|
117
303
|
});
|
|
118
304
|
});
|
|
119
305
|
|
|
@@ -142,6 +328,7 @@ describe("PolicyEngine — prefer-local capability soft-hint", () => {
|
|
|
142
328
|
registration("anthropic", 0),
|
|
143
329
|
],
|
|
144
330
|
selfProvider: "eliza-router",
|
|
331
|
+
slot: "TEXT_LARGE",
|
|
145
332
|
deviceTier: weakDevice,
|
|
146
333
|
});
|
|
147
334
|
expect(pick?.provider).toBe("anthropic");
|
|
@@ -157,6 +344,7 @@ describe("PolicyEngine — prefer-local capability soft-hint", () => {
|
|
|
157
344
|
registration("anthropic", 0),
|
|
158
345
|
],
|
|
159
346
|
selfProvider: "eliza-router",
|
|
347
|
+
slot: "TEXT_LARGE",
|
|
160
348
|
deviceTier: strongDevice,
|
|
161
349
|
});
|
|
162
350
|
expect(pick?.provider).toBe("eliza-local-inference");
|
|
@@ -10,18 +10,25 @@
|
|
|
10
10
|
* - manual — honour `preferredProvider`; when no pref set, fall
|
|
11
11
|
* through to the runtime's native priority order
|
|
12
12
|
* (highest registered priority wins).
|
|
13
|
-
* - auto — capability-driven: consult the device-tier assessment
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
13
|
+
* - auto — capability-driven: consult the device-tier assessment AND
|
|
14
|
+
* the live device signals (thermal + decode throughput). Route
|
|
15
|
+
* local only when the device can comfortably run the slot's
|
|
16
|
+
* modality (text → `canRunLocalLm`, voice → `canRunLocalVoice`)
|
|
17
|
+
* AND it is not currently throttled / below the TPS budget.
|
|
17
18
|
* Otherwise pick the highest-priority cloud provider.
|
|
18
19
|
* - cheapest — pick the provider with the lowest per-token cost.
|
|
19
20
|
* - fastest — pick the provider with the lowest tracked p50 latency
|
|
20
21
|
* (needs at least a few samples; falls back to native).
|
|
21
22
|
* - prefer-local — try local first; if it fails or has no handler,
|
|
22
|
-
* fall through to the next-best non-local. A
|
|
23
|
-
*
|
|
23
|
+
* fall through to the next-best non-local. A device that
|
|
24
|
+
* cannot run the slot's modality softly demotes the local
|
|
24
25
|
* pick so an unusable on-device path isn't forced.
|
|
26
|
+
* - local-only — always on-device: never returns a cloud provider. When no
|
|
27
|
+
* local handler is registered, returns `null` so the caller
|
|
28
|
+
* surfaces "no local provider" instead of silently routing
|
|
29
|
+
* to a paid API.
|
|
30
|
+
* - cloud-only — always off-device: never returns a local provider. Returns
|
|
31
|
+
* `null` when only local handlers exist.
|
|
25
32
|
* - round-robin — distribute load evenly across eligible providers.
|
|
26
33
|
*
|
|
27
34
|
* Latency is tracked in a ring buffer per provider per model type. Cost
|
|
@@ -32,7 +39,10 @@
|
|
|
32
39
|
|
|
33
40
|
import type { DeviceTierAssessment } from "./device-tier";
|
|
34
41
|
import type { HandlerRegistration } from "./handler-registry";
|
|
42
|
+
import type { LiveDeviceSignals } from "./live-signals";
|
|
43
|
+
import { liveSignalsDemoteLocal } from "./live-signals";
|
|
35
44
|
import type { RoutingPolicy } from "./routing-preferences";
|
|
45
|
+
import type { AgentModelSlot } from "./types";
|
|
36
46
|
|
|
37
47
|
const RING_SIZE = 32;
|
|
38
48
|
|
|
@@ -47,6 +57,12 @@ function isLocalProvider(provider: string): boolean {
|
|
|
47
57
|
return LOCAL_PROVIDERS.has(provider);
|
|
48
58
|
}
|
|
49
59
|
|
|
60
|
+
/** Voice slots use `canRunLocalVoice`; text slots use `canRunLocalLm`. */
|
|
61
|
+
const VOICE_SLOTS: ReadonlySet<AgentModelSlot> = new Set([
|
|
62
|
+
"TEXT_TO_SPEECH",
|
|
63
|
+
"TRANSCRIPTION",
|
|
64
|
+
]);
|
|
65
|
+
|
|
50
66
|
/**
|
|
51
67
|
* The first registered local handler in priority order, or null. Prefers the
|
|
52
68
|
* in-process / Capacitor backends over the device bridge, matching the
|
|
@@ -65,14 +81,33 @@ function findLocalCandidate(
|
|
|
65
81
|
}
|
|
66
82
|
|
|
67
83
|
/**
|
|
68
|
-
* Whether the device
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
84
|
+
* Whether the device can run this slot's modality locally *at all*, per the
|
|
85
|
+
* static tier assessment. Voice slots gate on `canRunLocalVoice` (the ASR + TTS
|
|
86
|
+
* budget is stricter than text); every other slot gates on `canRunLocalLm`.
|
|
87
|
+
* This is the per-modality independence AC4 requires — one assessment can yield
|
|
88
|
+
* local text + cloud voice (OKAY desktop) simultaneously.
|
|
89
|
+
*/
|
|
90
|
+
function modalityViableForSlot(
|
|
91
|
+
assessment: DeviceTierAssessment,
|
|
92
|
+
slot: AgentModelSlot | undefined,
|
|
93
|
+
): boolean {
|
|
94
|
+
return slot !== undefined && VOICE_SLOTS.has(slot)
|
|
95
|
+
? assessment.canRunLocalVoice
|
|
96
|
+
: assessment.canRunLocalLm;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Whether `auto` should default this slot to local: the modality must be viable
|
|
101
|
+
* AND the device must be a generally local-first machine (recommended "local",
|
|
102
|
+
* or a MAX/GOOD tier). A device that merely *can* run the modality but is steered
|
|
103
|
+
* to cloud by the classifier does not get a local default.
|
|
72
104
|
*/
|
|
73
|
-
function
|
|
105
|
+
function tierFavoursLocalForSlot(
|
|
106
|
+
assessment: DeviceTierAssessment | null,
|
|
107
|
+
slot: AgentModelSlot | undefined,
|
|
108
|
+
): boolean {
|
|
74
109
|
if (!assessment) return false;
|
|
75
|
-
if (!assessment
|
|
110
|
+
if (!modalityViableForSlot(assessment, slot)) return false;
|
|
76
111
|
return (
|
|
77
112
|
assessment.recommendedMode === "local" ||
|
|
78
113
|
assessment.tier === "MAX" ||
|
|
@@ -194,11 +229,25 @@ class PolicyEngine {
|
|
|
194
229
|
/** Provider ID of the router itself — always excluded from candidates. */
|
|
195
230
|
selfProvider: string;
|
|
196
231
|
/**
|
|
197
|
-
*
|
|
198
|
-
*
|
|
199
|
-
*
|
|
232
|
+
* The agent slot being routed. Drives the per-modality `auto` gate:
|
|
233
|
+
* voice slots (`TEXT_TO_SPEECH` / `TRANSCRIPTION`) check
|
|
234
|
+
* `canRunLocalVoice`; every other slot checks `canRunLocalLm`.
|
|
235
|
+
*/
|
|
236
|
+
slot?: AgentModelSlot;
|
|
237
|
+
/**
|
|
238
|
+
* Static device-capability assessment from `classifyDeviceTier()`.
|
|
239
|
+
* Consulted by `auto` (per-modality gate) and used as a soft hint by
|
|
240
|
+
* `prefer-local`. Null when the host hasn't probed hardware yet — `auto`
|
|
241
|
+
* then falls back to cloud.
|
|
200
242
|
*/
|
|
201
243
|
deviceTier?: DeviceTierAssessment | null;
|
|
244
|
+
/**
|
|
245
|
+
* Live device signals (thermal + decode throughput). When the device is
|
|
246
|
+
* currently throttled or below the TPS budget, `auto` demotes a local
|
|
247
|
+
* pick to cloud even if the static tier favoured local. Null = no live
|
|
248
|
+
* demotion (the static decision stands).
|
|
249
|
+
*/
|
|
250
|
+
liveSignals?: LiveDeviceSignals | null;
|
|
202
251
|
}): HandlerRegistration | null {
|
|
203
252
|
const eligible = args.candidates
|
|
204
253
|
.filter((c) => c.provider !== args.selfProvider)
|
|
@@ -221,16 +270,35 @@ class PolicyEngine {
|
|
|
221
270
|
return eligible[0] ?? null;
|
|
222
271
|
}
|
|
223
272
|
case "auto": {
|
|
224
|
-
// Capability-driven: route
|
|
225
|
-
//
|
|
226
|
-
//
|
|
273
|
+
// Capability-driven: route local only when the device can run this
|
|
274
|
+
// slot's modality (per-modality gate: text → canRunLocalLm, voice →
|
|
275
|
+
// canRunLocalVoice) AND it is not currently throttled / below the TPS
|
|
276
|
+
// budget. Otherwise pick the highest-priority cloud provider.
|
|
227
277
|
const local = findLocalCandidate(eligible);
|
|
228
|
-
|
|
278
|
+
const tierFavours = tierFavoursLocalForSlot(
|
|
279
|
+
args.deviceTier ?? null,
|
|
280
|
+
args.slot,
|
|
281
|
+
);
|
|
282
|
+
const liveDemotes =
|
|
283
|
+
args.liveSignals != null && liveSignalsDemoteLocal(args.liveSignals);
|
|
284
|
+
if (local && tierFavours && !liveDemotes) {
|
|
229
285
|
return local;
|
|
230
286
|
}
|
|
231
287
|
const cloud = eligible.find((c) => !isLocalProvider(c.provider));
|
|
232
288
|
return cloud ?? eligible[0] ?? null;
|
|
233
289
|
}
|
|
290
|
+
case "local-only": {
|
|
291
|
+
// Hard local guarantee: only ever return an on-device handler. When
|
|
292
|
+
// none is registered we return null so the dispatch loop fails
|
|
293
|
+
// closed — it never silently falls through to a cloud provider.
|
|
294
|
+
// This is the per-slot canonical replacement for ELIZA_LOCAL_ONLY.
|
|
295
|
+
return findLocalCandidate(eligible);
|
|
296
|
+
}
|
|
297
|
+
case "cloud-only": {
|
|
298
|
+
// Force cloud: never dispatch to an on-device backend. Returns null
|
|
299
|
+
// (→ dispatch fails closed) when only local handlers are registered.
|
|
300
|
+
return eligible.find((c) => !isLocalProvider(c.provider)) ?? null;
|
|
301
|
+
}
|
|
234
302
|
case "cheapest": {
|
|
235
303
|
const ranked = [...eligible].sort((a, b) => {
|
|
236
304
|
const ca = this.costOf(a.provider) ?? Number.POSITIVE_INFINITY;
|
|
@@ -256,12 +324,13 @@ class PolicyEngine {
|
|
|
256
324
|
}
|
|
257
325
|
case "prefer-local": {
|
|
258
326
|
const local = findLocalCandidate(eligible);
|
|
259
|
-
// Soft capability hint: a
|
|
260
|
-
//
|
|
327
|
+
// Soft capability hint: a device that cannot run this slot's
|
|
328
|
+
// modality demotes the local pick so we don't force an unusable
|
|
261
329
|
// on-device path. When no assessment is present, keep the
|
|
262
330
|
// historical local-first behaviour.
|
|
263
331
|
const tier = args.deviceTier ?? null;
|
|
264
|
-
const localUnviable =
|
|
332
|
+
const localUnviable =
|
|
333
|
+
tier !== null && !modalityViableForSlot(tier, args.slot);
|
|
265
334
|
if (local && !localUnviable) return local;
|
|
266
335
|
const cloud = eligible.find((c) => !isLocalProvider(c.provider));
|
|
267
336
|
if (cloud) return cloud;
|
|
@@ -278,6 +347,7 @@ class PolicyEngine {
|
|
|
278
347
|
return ranked[0] ?? null;
|
|
279
348
|
}
|
|
280
349
|
}
|
|
350
|
+
return eligible[0] ?? null;
|
|
281
351
|
}
|
|
282
352
|
|
|
283
353
|
/** For tests and diagnostics. */
|
|
@@ -93,8 +93,8 @@ describe("LocalInferenceService activation prewarm", () => {
|
|
|
93
93
|
const prewarm = vi
|
|
94
94
|
.spyOn(localInferenceEngine, "prewarmConversation")
|
|
95
95
|
.mockResolvedValue(true);
|
|
96
|
-
const
|
|
97
|
-
.spyOn(localInferenceEngine, "
|
|
96
|
+
const asrReady = vi
|
|
97
|
+
.spyOn(localInferenceEngine, "ensureActiveBundleAsrReady")
|
|
98
98
|
.mockResolvedValue({} as never);
|
|
99
99
|
const transcribe = vi
|
|
100
100
|
.spyOn(localInferenceEngine, "transcribePcm")
|
|
@@ -122,7 +122,7 @@ describe("LocalInferenceService activation prewarm", () => {
|
|
|
122
122
|
"stable-stage1-prefix",
|
|
123
123
|
);
|
|
124
124
|
});
|
|
125
|
-
expect(
|
|
125
|
+
expect(asrReady).toHaveBeenCalledOnce();
|
|
126
126
|
expect(transcribe).toHaveBeenCalledWith({
|
|
127
127
|
pcm: expect.any(Float32Array),
|
|
128
128
|
sampleRate: 16_000,
|
package/src/services/service.ts
CHANGED
|
@@ -26,7 +26,6 @@ import { MODEL_CATALOG } from "./catalog";
|
|
|
26
26
|
import { Downloader } from "./downloader";
|
|
27
27
|
import { localInferenceEngine } from "./engine";
|
|
28
28
|
import { probeHardware } from "./hardware";
|
|
29
|
-
import { searchHuggingFaceGguf, searchModelHubGguf } from "./hf-search";
|
|
30
29
|
import {
|
|
31
30
|
createImageGenCapabilityRegistration,
|
|
32
31
|
type ImageGenBackend,
|
|
@@ -286,10 +285,8 @@ export class LocalInferenceService {
|
|
|
286
285
|
return null;
|
|
287
286
|
}
|
|
288
287
|
|
|
289
|
-
async startDownload(
|
|
290
|
-
|
|
291
|
-
): Promise<DownloadJob> {
|
|
292
|
-
return this.downloader.start(modelIdOrSpec);
|
|
288
|
+
async startDownload(modelId: string): Promise<DownloadJob> {
|
|
289
|
+
return this.downloader.start(modelId);
|
|
293
290
|
}
|
|
294
291
|
|
|
295
292
|
async startSmallerFallbackDownload(
|
|
@@ -314,7 +311,9 @@ export class LocalInferenceService {
|
|
|
314
311
|
query: string,
|
|
315
312
|
limit?: number,
|
|
316
313
|
): Promise<CatalogModel[]> {
|
|
317
|
-
|
|
314
|
+
void query;
|
|
315
|
+
void limit;
|
|
316
|
+
return [];
|
|
318
317
|
}
|
|
319
318
|
|
|
320
319
|
async searchModelHub(
|
|
@@ -322,7 +321,10 @@ export class LocalInferenceService {
|
|
|
322
321
|
hub: "huggingface" | "modelscope",
|
|
323
322
|
limit?: number,
|
|
324
323
|
): Promise<CatalogModel[]> {
|
|
325
|
-
|
|
324
|
+
void query;
|
|
325
|
+
void hub;
|
|
326
|
+
void limit;
|
|
327
|
+
return [];
|
|
326
328
|
}
|
|
327
329
|
|
|
328
330
|
/**
|
|
@@ -498,6 +500,12 @@ export class LocalInferenceService {
|
|
|
498
500
|
0,
|
|
499
501
|
Math.floor(totalmem() / (1024 * 1024)) - ramHeadroomReserveMb(),
|
|
500
502
|
),
|
|
503
|
+
// The dominant resident consumer — the active text/embedding bundle —
|
|
504
|
+
// is owned by the engine, not the arbiter's resident map. Feed its
|
|
505
|
+
// footprint in so the proactive fit-to-budget `evictToFit` path
|
|
506
|
+
// actually trips before a second model overcommits RAM, instead of
|
|
507
|
+
// silently no-opping on the two roles that matter most (#8809 AC#1).
|
|
508
|
+
externalFootprintMb: () => localInferenceEngine.getResidentFootprintMb(),
|
|
501
509
|
});
|
|
502
510
|
arbiter.start();
|
|
503
511
|
setMemoryArbiter(arbiter);
|
|
@@ -528,6 +536,13 @@ export class LocalInferenceService {
|
|
|
528
536
|
maxTokens: request.maxTokens,
|
|
529
537
|
temperature: request.temperature,
|
|
530
538
|
signal: request.signal,
|
|
539
|
+
// Stream the description token-by-token when the caller wired
|
|
540
|
+
// a chunk sink (the IMAGE_DESCRIPTION handler forwards the
|
|
541
|
+
// runtime's onStreamChunk here); the engine/backend decode
|
|
542
|
+
// it through the same pipe as chat text when the fused lib
|
|
543
|
+
// exposes ABI-v13 streaming vision.
|
|
544
|
+
onTextChunk: request.onTextChunk,
|
|
545
|
+
maxTokensPerStep: request.maxTokensPerStep,
|
|
531
546
|
});
|
|
532
547
|
const trimmed = result.text.trim();
|
|
533
548
|
if (!trimmed) {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Tests for the `TRANSCRIPTION` model handler priority + provider hint
|
|
3
3
|
* semantics on `AgentRuntime`. These exercise the same `registerModel`
|
|
4
4
|
* machinery used by plugin-elizacloud (remote OpenAI Whisper API) and the
|
|
5
|
-
* local fused
|
|
5
|
+
* local fused Gemma ASR handler so callers know exactly:
|
|
6
6
|
*
|
|
7
7
|
* - which handler wins when priorities tie (first-registered),
|
|
8
8
|
* - how an explicit `priority` overrides that,
|
|
@@ -60,7 +60,7 @@ function makeHandler(
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
describe("TRANSCRIPTION handler priority on AgentRuntime", () => {
|
|
63
|
-
it("local
|
|
63
|
+
it("local Gemma ASR wins over remote OpenAI Whisper by registration order when priorities tie", async () => {
|
|
64
64
|
const { runtime, calls } = makeRuntime();
|
|
65
65
|
runtime.registerModel(
|
|
66
66
|
ModelType.TRANSCRIPTION,
|
package/src/services/types.ts
CHANGED
|
@@ -15,6 +15,8 @@ export {
|
|
|
15
15
|
type CatalogQuantizationMatrix,
|
|
16
16
|
type CatalogQuantizationVariant,
|
|
17
17
|
type CpuFeatureProbe,
|
|
18
|
+
classifyCatalogModelRuntimeClass,
|
|
19
|
+
classifyInstalledModelRuntimeClass,
|
|
18
20
|
type DownloadEvent,
|
|
19
21
|
type DownloadJob,
|
|
20
22
|
type DownloadState,
|
|
@@ -38,9 +40,11 @@ export {
|
|
|
38
40
|
type ModelHubSnapshot,
|
|
39
41
|
type OpenVinoDeviceKind,
|
|
40
42
|
type OpenVinoHardwareProbe,
|
|
43
|
+
type RuntimeClass,
|
|
41
44
|
TEXT_GENERATION_SLOTS,
|
|
42
45
|
type TextGenerationSlot,
|
|
43
46
|
type TokenizerFamily,
|
|
47
|
+
withRuntimeClass,
|
|
44
48
|
} from "@elizaos/shared";
|
|
45
49
|
|
|
46
50
|
/** RAM requirements for a model bundle. */
|
|
@@ -32,10 +32,10 @@ function verifier() {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
const ARGS = {
|
|
35
|
-
modelId: "eliza-1-
|
|
35
|
+
modelId: "eliza-1-2b",
|
|
36
36
|
bundleRoot: "/tmp/bundle",
|
|
37
37
|
manifestPath: "/tmp/bundle/eliza-1.manifest.json",
|
|
38
|
-
textGgufPath: "/tmp/bundle/text/eliza-1-
|
|
38
|
+
textGgufPath: "/tmp/bundle/text/eliza-1-2b.gguf",
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
afterEach(() => {
|