@elizaos/plugin-local-inference 2.0.0-beta.1 → 2.0.11-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +83 -0
- package/package.json +81 -15
- package/src/actions/generate-media.d.ts +59 -0
- package/src/actions/generate-media.d.ts.map +1 -0
- package/src/actions/generate-media.ts +647 -0
- package/src/actions/identify-speaker.d.ts +23 -0
- package/src/actions/identify-speaker.d.ts.map +1 -0
- package/src/actions/identify-speaker.ts +171 -0
- package/src/adapters/capacitor-llama/__tests__/compat-behavior.test.ts +218 -0
- package/src/adapters/capacitor-llama/__tests__/index.test.ts +68 -0
- package/src/adapters/capacitor-llama/__tests__/structured-output.test.ts +215 -0
- package/src/adapters/capacitor-llama/__tests__/text-streaming.test.ts +174 -0
- package/src/adapters/capacitor-llama/environment.ts +71 -0
- package/src/adapters/capacitor-llama/index.browser.ts +83 -0
- package/src/adapters/capacitor-llama/index.ts +807 -0
- package/src/adapters/capacitor-llama/loader.ts +109 -0
- package/src/adapters/capacitor-llama/structured-output.ts +165 -0
- package/src/adapters/capacitor-llama/text-streaming.ts +227 -0
- package/src/adapters/capacitor-llama/types.ts +374 -0
- package/src/backends/apple-foundation.ts +127 -0
- package/src/index.d.ts +7 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.ts +54 -0
- package/src/local-inference-routes.d.ts +38 -0
- package/src/local-inference-routes.d.ts.map +1 -0
- package/src/local-inference-routes.test.ts +344 -0
- package/src/local-inference-routes.ts +1543 -0
- package/src/provider.d.ts +21 -0
- package/src/provider.d.ts.map +1 -0
- package/src/provider.ts +1171 -0
- package/src/routes/compat-helpers.d.ts +18 -0
- package/src/routes/compat-helpers.d.ts.map +1 -0
- package/src/routes/compat-helpers.ts +274 -0
- package/src/routes/family-member-route.d.ts +62 -0
- package/src/routes/family-member-route.d.ts.map +1 -0
- package/src/routes/family-member-route.ts +353 -0
- package/src/routes/index.d.ts +19 -0
- package/src/routes/index.d.ts.map +1 -0
- package/src/routes/index.ts +60 -0
- package/src/routes/live-diarization-route.d.ts +26 -0
- package/src/routes/live-diarization-route.d.ts.map +1 -0
- package/src/routes/live-diarization-route.test.ts +213 -0
- package/src/routes/live-diarization-route.ts +122 -0
- package/src/routes/local-inference-asr-route.d.ts +4 -0
- package/src/routes/local-inference-asr-route.d.ts.map +1 -0
- package/src/routes/local-inference-asr-route.test.ts +190 -0
- package/src/routes/local-inference-asr-route.ts +213 -0
- package/src/routes/local-inference-compat-routes.d.ts +16 -0
- package/src/routes/local-inference-compat-routes.d.ts.map +1 -0
- package/src/routes/local-inference-compat-routes.test.ts +423 -0
- package/src/routes/local-inference-compat-routes.ts +782 -0
- package/src/routes/local-inference-tts-route.d.ts +7 -0
- package/src/routes/local-inference-tts-route.d.ts.map +1 -0
- package/src/routes/local-inference-tts-route.test.ts +179 -0
- package/src/routes/local-inference-tts-route.ts +230 -0
- package/src/routes/voice-first-run-routes.d.ts +62 -0
- package/src/routes/voice-first-run-routes.d.ts.map +1 -0
- package/src/routes/voice-first-run-routes.ts +524 -0
- package/src/routes/voice-models-routes.d.ts +62 -0
- package/src/routes/voice-models-routes.d.ts.map +1 -0
- package/src/routes/voice-models-routes.ts +554 -0
- package/src/routes/voice-profile-plugin-routes.d.ts +19 -0
- package/src/routes/voice-profile-plugin-routes.d.ts.map +1 -0
- package/src/routes/voice-profile-plugin-routes.ts +138 -0
- package/src/routes/voice-profiles-management-routes.d.ts +52 -0
- package/src/routes/voice-profiles-management-routes.d.ts.map +1 -0
- package/src/routes/voice-profiles-management-routes.ts +476 -0
- package/src/routes/voice-speaker-profile-routes.d.ts +57 -0
- package/src/routes/voice-speaker-profile-routes.d.ts.map +1 -0
- package/src/routes/voice-speaker-profile-routes.ts +199 -0
- package/src/runtime/aosp-llama-loader-selection.test.ts +80 -0
- package/src/runtime/capacitor-llama.d.ts +25 -0
- package/src/runtime/embedding-manager-support.d.ts +77 -0
- package/src/runtime/embedding-manager-support.d.ts.map +1 -0
- package/src/runtime/embedding-manager-support.ts +497 -0
- package/src/runtime/embedding-presets.d.ts +16 -0
- package/src/runtime/embedding-presets.d.ts.map +1 -0
- package/src/runtime/embedding-presets.ts +81 -0
- package/src/runtime/embedding-warmup-policy.d.ts +14 -0
- package/src/runtime/embedding-warmup-policy.d.ts.map +1 -0
- package/src/runtime/embedding-warmup-policy.test.ts +53 -0
- package/src/runtime/embedding-warmup-policy.ts +48 -0
- package/src/runtime/ensure-local-inference-handler.d.ts +53 -0
- package/src/runtime/ensure-local-inference-handler.d.ts.map +1 -0
- package/src/runtime/ensure-local-inference-handler.test.ts +528 -0
- package/src/runtime/ensure-local-inference-handler.ts +1398 -0
- package/src/runtime/index.d.ts +14 -0
- package/src/runtime/index.d.ts.map +1 -0
- package/src/runtime/index.ts +27 -0
- package/src/runtime/mobile-local-inference-gate.d.ts +31 -0
- package/src/runtime/mobile-local-inference-gate.d.ts.map +1 -0
- package/src/runtime/mobile-local-inference-gate.test.ts +69 -0
- package/src/runtime/mobile-local-inference-gate.ts +44 -0
- package/src/runtime/voice-entity-binding.d.ts +103 -0
- package/src/runtime/voice-entity-binding.d.ts.map +1 -0
- package/src/runtime/voice-entity-binding.transcript.test.ts +69 -0
- package/src/runtime/voice-entity-binding.ts +328 -0
- package/src/services/README.md +71 -0
- package/src/services/__tests__/backend-selector.test.ts +101 -0
- package/src/services/__tests__/checkpoint-manager.test.ts +376 -0
- package/src/services/__tests__/gpu-autotune.test.ts +400 -0
- package/src/services/__tests__/llm-streaming-binding.test.ts +85 -0
- package/src/services/__tests__/planner-grammar.test.ts +372 -0
- package/src/services/__tests__/runtime-target.test.ts +176 -0
- package/src/services/active-model-switch-rollback.test.ts +183 -0
- package/src/services/active-model.d.ts +282 -0
- package/src/services/active-model.d.ts.map +1 -0
- package/src/services/active-model.ts +1213 -0
- package/src/services/asr/errors.d.ts +21 -0
- package/src/services/asr/errors.d.ts.map +1 -0
- package/src/services/asr/errors.ts +50 -0
- package/src/services/asr/hash.d.ts +28 -0
- package/src/services/asr/hash.d.ts.map +1 -0
- package/src/services/asr/hash.ts +49 -0
- package/src/services/asr/index.d.ts +76 -0
- package/src/services/asr/index.d.ts.map +1 -0
- package/src/services/asr/index.ts +178 -0
- package/src/services/asr/types.d.ts +91 -0
- package/src/services/asr/types.d.ts.map +1 -0
- package/src/services/asr/types.ts +95 -0
- package/src/services/assignments.d.ts +71 -0
- package/src/services/assignments.d.ts.map +1 -0
- package/src/services/assignments.test.ts +80 -0
- package/src/services/assignments.ts +230 -0
- package/src/services/backend-selector.ts +95 -0
- package/src/services/backend.d.ts +346 -0
- package/src/services/backend.d.ts.map +1 -0
- package/src/services/backend.ts +612 -0
- package/src/services/bundled-models.d.ts +34 -0
- package/src/services/bundled-models.d.ts.map +1 -0
- package/src/services/bundled-models.ts +129 -0
- package/src/services/cache-bridge.d.ts +206 -0
- package/src/services/cache-bridge.d.ts.map +1 -0
- package/src/services/cache-bridge.test.ts +516 -0
- package/src/services/cache-bridge.ts +423 -0
- package/src/services/catalog.d.ts +10 -0
- package/src/services/catalog.d.ts.map +1 -0
- package/src/services/catalog.test.ts +240 -0
- package/src/services/catalog.ts +27 -0
- package/src/services/checkpoint-client.d.ts +109 -0
- package/src/services/checkpoint-client.d.ts.map +1 -0
- package/src/services/checkpoint-client.ts +258 -0
- package/src/services/checkpoint-manager.ts +474 -0
- package/src/services/cloud-fallback.d.ts +102 -0
- package/src/services/cloud-fallback.d.ts.map +1 -0
- package/src/services/cloud-fallback.ts +230 -0
- package/src/services/conversation-registry.d.ts +142 -0
- package/src/services/conversation-registry.d.ts.map +1 -0
- package/src/services/conversation-registry.test.ts +235 -0
- package/src/services/conversation-registry.ts +264 -0
- package/src/services/desktop-fused-ffi-backend-runtime.d.ts +92 -0
- package/src/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
- package/src/services/desktop-fused-ffi-backend-runtime.ts +333 -0
- package/src/services/device-bridge.d.ts +188 -0
- package/src/services/device-bridge.d.ts.map +1 -0
- package/src/services/device-bridge.ts +1237 -0
- package/src/services/device-resource-metrics.d.ts +149 -0
- package/src/services/device-resource-metrics.d.ts.map +1 -0
- package/src/services/device-resource-metrics.test.ts +98 -0
- package/src/services/device-resource-metrics.ts +346 -0
- package/src/services/device-tier.d.ts +115 -0
- package/src/services/device-tier.d.ts.map +1 -0
- package/src/services/device-tier.test.ts +371 -0
- package/src/services/device-tier.ts +410 -0
- package/src/services/downloader.d.ts +82 -0
- package/src/services/downloader.d.ts.map +1 -0
- package/src/services/downloader.test.ts +724 -0
- package/src/services/downloader.ts +899 -0
- package/src/services/engine-direct-bundle.test.ts +58 -0
- package/src/services/engine-streaming.test.ts +80 -0
- package/src/services/engine.d.ts +534 -0
- package/src/services/engine.d.ts.map +1 -0
- package/src/services/engine.ts +1891 -0
- package/src/services/ensure-local-artifacts.integration.test.ts +273 -0
- package/src/services/ensure-local-artifacts.test.ts +368 -0
- package/src/services/ensure-local-artifacts.ts +351 -0
- package/src/services/external-scanner.d.ts +17 -0
- package/src/services/external-scanner.d.ts.map +1 -0
- package/src/services/external-scanner.ts +312 -0
- package/src/services/ffi-llm-mock.ts +354 -0
- package/src/services/ffi-llm-streaming-abi.ts +442 -0
- package/src/services/ffi-streaming-backend.d.ts +180 -0
- package/src/services/ffi-streaming-backend.d.ts.map +1 -0
- package/src/services/ffi-streaming-backend.ts +382 -0
- package/src/services/ffi-streaming-runner.d.ts +122 -0
- package/src/services/ffi-streaming-runner.d.ts.map +1 -0
- package/src/services/ffi-streaming-runner.test.ts +60 -0
- package/src/services/ffi-streaming-runner.ts +354 -0
- package/src/services/ffi-unload-ordering.test.ts +162 -0
- package/src/services/gpu-autotune.ts +534 -0
- package/src/services/gpu-detect.ts +139 -0
- package/src/services/handler-registry.d.ts +72 -0
- package/src/services/handler-registry.d.ts.map +1 -0
- package/src/services/handler-registry.ts +240 -0
- package/src/services/hardware.d.ts +63 -0
- package/src/services/hardware.d.ts.map +1 -0
- package/src/services/hardware.test.ts +183 -0
- package/src/services/hardware.ts +404 -0
- package/src/services/hf-search.d.ts +26 -0
- package/src/services/hf-search.d.ts.map +1 -0
- package/src/services/hf-search.test.ts +69 -0
- package/src/services/hf-search.ts +420 -0
- package/src/services/image-description-runtime.d.ts +14 -0
- package/src/services/image-description-runtime.d.ts.map +1 -0
- package/src/services/image-description-runtime.test.ts +61 -0
- package/src/services/image-description-runtime.ts +118 -0
- package/src/services/imagegen/aosp-unavailable.d.ts +134 -0
- package/src/services/imagegen/aosp-unavailable.d.ts.map +1 -0
- package/src/services/imagegen/aosp-unavailable.ts +229 -0
- package/src/services/imagegen/backend-selector.d.ts +118 -0
- package/src/services/imagegen/backend-selector.d.ts.map +1 -0
- package/src/services/imagegen/backend-selector.ts +281 -0
- package/src/services/imagegen/coreml-unavailable.d.ts +105 -0
- package/src/services/imagegen/coreml-unavailable.d.ts.map +1 -0
- package/src/services/imagegen/coreml-unavailable.ts +237 -0
- package/src/services/imagegen/errors.d.ts +16 -0
- package/src/services/imagegen/errors.d.ts.map +1 -0
- package/src/services/imagegen/errors.ts +40 -0
- package/src/services/imagegen/index.d.ts +58 -0
- package/src/services/imagegen/index.d.ts.map +1 -0
- package/src/services/imagegen/index.ts +144 -0
- package/src/services/imagegen/mflux.d.ts +74 -0
- package/src/services/imagegen/mflux.d.ts.map +1 -0
- package/src/services/imagegen/mflux.ts +313 -0
- package/src/services/imagegen/sd-cpp.d.ts +180 -0
- package/src/services/imagegen/sd-cpp.d.ts.map +1 -0
- package/src/services/imagegen/sd-cpp.ts +718 -0
- package/src/services/imagegen/tensorrt-unavailable.d.ts +83 -0
- package/src/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
- package/src/services/imagegen/tensorrt-unavailable.ts +295 -0
- package/src/services/imagegen/types.d.ts +181 -0
- package/src/services/imagegen/types.d.ts.map +1 -0
- package/src/services/imagegen/types.ts +193 -0
- package/src/services/index.d.ts +30 -0
- package/src/services/index.d.ts.map +1 -0
- package/src/services/index.ts +225 -0
- package/src/services/inference-capabilities.d.ts +132 -0
- package/src/services/inference-capabilities.d.ts.map +1 -0
- package/src/services/inference-capabilities.test.ts +75 -0
- package/src/services/inference-capabilities.ts +204 -0
- package/src/services/inference-telemetry.d.ts +59 -0
- package/src/services/inference-telemetry.d.ts.map +1 -0
- package/src/services/inference-telemetry.ts +143 -0
- package/src/services/ios-llama-streaming.ts +248 -0
- package/src/services/kv-spill.d.ts +189 -0
- package/src/services/kv-spill.d.ts.map +1 -0
- package/src/services/kv-spill.test.ts +222 -0
- package/src/services/kv-spill.ts +356 -0
- package/src/services/latency-trace.d.ts +346 -0
- package/src/services/latency-trace.d.ts.map +1 -0
- package/src/services/latency-trace.test.ts +266 -0
- package/src/services/latency-trace.ts +844 -0
- package/src/services/llama-server-metrics.ts +304 -0
- package/src/services/llm-streaming-binding.d.ts +96 -0
- package/src/services/llm-streaming-binding.d.ts.map +1 -0
- package/src/services/llm-streaming-binding.ts +136 -0
- package/src/services/load-args.d.ts +82 -0
- package/src/services/load-args.d.ts.map +1 -0
- package/src/services/load-args.ts +81 -0
- package/src/services/manifest/eliza-1.manifest.v1.json +708 -0
- package/src/services/manifest/index.d.ts +4 -0
- package/src/services/manifest/index.d.ts.map +1 -0
- package/src/services/manifest/index.ts +66 -0
- package/src/services/manifest/manifest.test.ts +693 -0
- package/src/services/manifest/schema.d.ts +715 -0
- package/src/services/manifest/schema.d.ts.map +1 -0
- package/src/services/manifest/schema.ts +655 -0
- package/src/services/manifest/types.d.ts +30 -0
- package/src/services/manifest/types.d.ts.map +1 -0
- package/src/services/manifest/types.ts +55 -0
- package/src/services/manifest/validator.d.ts +66 -0
- package/src/services/manifest/validator.d.ts.map +1 -0
- package/src/services/manifest/validator.ts +569 -0
- package/src/services/memory-arbiter.d.ts +343 -0
- package/src/services/memory-arbiter.d.ts.map +1 -0
- package/src/services/memory-arbiter.test.ts +419 -0
- package/src/services/memory-arbiter.ts +1000 -0
- package/src/services/memory-monitor.d.ts +119 -0
- package/src/services/memory-monitor.d.ts.map +1 -0
- package/src/services/memory-monitor.test.ts +208 -0
- package/src/services/memory-monitor.ts +296 -0
- package/src/services/memory-pressure.d.ts +127 -0
- package/src/services/memory-pressure.d.ts.map +1 -0
- package/src/services/memory-pressure.ts +413 -0
- package/src/services/mtp-doctor.d.ts +13 -0
- package/src/services/mtp-doctor.d.ts.map +1 -0
- package/src/services/mtp-doctor.ts +78 -0
- package/src/services/network-policy.d.ts +127 -0
- package/src/services/network-policy.d.ts.map +1 -0
- package/src/services/network-policy.ts +346 -0
- package/src/services/paths.d.ts +6 -0
- package/src/services/paths.d.ts.map +1 -0
- package/src/services/paths.ts +25 -0
- package/src/services/planner-skeleton.d.ts +124 -0
- package/src/services/planner-skeleton.d.ts.map +1 -0
- package/src/services/planner-skeleton.ts +175 -0
- package/src/services/providers.d.ts +38 -0
- package/src/services/providers.d.ts.map +1 -0
- package/src/services/providers.ts +507 -0
- package/src/services/ram-budget-cache.test.ts +163 -0
- package/src/services/ram-budget.d.ts +110 -0
- package/src/services/ram-budget.d.ts.map +1 -0
- package/src/services/ram-budget.ts +0 -0
- package/src/services/readiness.d.ts +9 -0
- package/src/services/readiness.d.ts.map +1 -0
- package/src/services/readiness.test.ts +87 -0
- package/src/services/readiness.ts +238 -0
- package/src/services/recommendation.d.ts +111 -0
- package/src/services/recommendation.d.ts.map +1 -0
- package/src/services/recommendation.ts +672 -0
- package/src/services/registry.d.ts +35 -0
- package/src/services/registry.d.ts.map +1 -0
- package/src/services/registry.ts +151 -0
- package/src/services/router-handler.d.ts +92 -0
- package/src/services/router-handler.d.ts.map +1 -0
- package/src/services/router-handler.test.ts +45 -0
- package/src/services/router-handler.ts +376 -0
- package/src/services/routing-policy.d.ts +55 -0
- package/src/services/routing-policy.d.ts.map +1 -0
- package/src/services/routing-policy.ts +228 -0
- package/src/services/routing-preferences.d.ts +8 -0
- package/src/services/routing-preferences.d.ts.map +1 -0
- package/src/services/routing-preferences.ts +15 -0
- package/src/services/runtime-target.d.ts +98 -0
- package/src/services/runtime-target.d.ts.map +1 -0
- package/src/services/runtime-target.ts +154 -0
- package/src/services/service.d.ts +128 -0
- package/src/services/service.d.ts.map +1 -0
- package/src/services/service.test.ts +223 -0
- package/src/services/service.ts +735 -0
- package/src/services/session-pool.d.ts +72 -0
- package/src/services/session-pool.d.ts.map +1 -0
- package/src/services/session-pool.ts +153 -0
- package/src/services/structured-output/deterministic-repair.d.ts +23 -0
- package/src/services/structured-output/deterministic-repair.d.ts.map +1 -0
- package/src/services/structured-output/deterministic-repair.test.ts +169 -0
- package/src/services/structured-output/deterministic-repair.ts +443 -0
- package/src/services/structured-output/index.ts +4 -0
- package/src/services/structured-output.d.ts +311 -0
- package/src/services/structured-output.d.ts.map +1 -0
- package/src/services/structured-output.test.ts +483 -0
- package/src/services/structured-output.ts +712 -0
- package/src/services/transcription-priority.test.ts +211 -0
- package/src/services/tts/errors.ts +46 -0
- package/src/services/tts/index.ts +214 -0
- package/src/services/tts/tts-audio-cache.ts +235 -0
- package/src/services/tts/types.ts +157 -0
- package/src/services/types.d.ts +19 -0
- package/src/services/types.d.ts.map +1 -0
- package/src/services/types.ts +55 -0
- package/src/services/verify-on-device.d.ts +34 -0
- package/src/services/verify-on-device.d.ts.map +1 -0
- package/src/services/verify-on-device.test.ts +87 -0
- package/src/services/verify-on-device.ts +127 -0
- package/src/services/verify.d.ts +8 -0
- package/src/services/verify.d.ts.map +1 -0
- package/src/services/verify.ts +13 -0
- package/src/services/vision/aosp-unavailable.d.ts +115 -0
- package/src/services/vision/aosp-unavailable.d.ts.map +1 -0
- package/src/services/vision/aosp-unavailable.ts +163 -0
- package/src/services/vision/capacitor-llama.d.ts +99 -0
- package/src/services/vision/capacitor-llama.d.ts.map +1 -0
- package/src/services/vision/capacitor-llama.ts +255 -0
- package/src/services/vision/cloud-fallback.d.ts +47 -0
- package/src/services/vision/cloud-fallback.d.ts.map +1 -0
- package/src/services/vision/cloud-fallback.test.ts +243 -0
- package/src/services/vision/cloud-fallback.ts +268 -0
- package/src/services/vision/fallback-chain.test.ts +86 -0
- package/src/services/vision/hash.d.ts +71 -0
- package/src/services/vision/hash.d.ts.map +1 -0
- package/src/services/vision/hash.ts +157 -0
- package/src/services/vision/index.d.ts +95 -0
- package/src/services/vision/index.d.ts.map +1 -0
- package/src/services/vision/index.ts +251 -0
- package/src/services/vision/llama-server.d.ts +73 -0
- package/src/services/vision/llama-server.d.ts.map +1 -0
- package/src/services/vision/llama-server.ts +177 -0
- package/src/services/vision/types.d.ts +153 -0
- package/src/services/vision/types.d.ts.map +1 -0
- package/src/services/vision/types.ts +154 -0
- package/src/services/vision/vast-fallback.d.ts +18 -0
- package/src/services/vision/vast-fallback.d.ts.map +1 -0
- package/src/services/vision/vast-fallback.ts +127 -0
- package/src/services/vision-embedding-cache.d.ts +98 -0
- package/src/services/vision-embedding-cache.d.ts.map +1 -0
- package/src/services/vision-embedding-cache.ts +189 -0
- package/src/services/voice/VOICE_WORKBENCH.md +88 -0
- package/src/services/voice/__test-helpers__/fake-ffi.ts +92 -0
- package/src/services/voice/__test-helpers__/synthetic-speech.ts +124 -0
- package/src/services/voice/__tests__/checkpoint-manager.test.ts +241 -0
- package/src/services/voice/__tests__/checkpoint-policy.test.ts +270 -0
- package/src/services/voice/__tests__/eager-context-builder.test.ts +257 -0
- package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +288 -0
- package/src/services/voice/__tests__/eot-classifier.test.ts +431 -0
- package/src/services/voice/__tests__/optimistic-rollback.test.ts +312 -0
- package/src/services/voice/__tests__/prefill-client.test.ts +266 -0
- package/src/services/voice/__tests__/prefix-preserving-queue.test.ts +208 -0
- package/src/services/voice/__tests__/streaming-asr.test.ts +450 -0
- package/src/services/voice/__tests__/streaming-transcriber.test.ts +339 -0
- package/src/services/voice/__tests__/turn-detector-resolver.test.ts +197 -0
- package/src/services/voice/__tests__/voice-state-machine-prefill.test.ts +275 -0
- package/src/services/voice/__tests__/voice-state-machine.test.ts +354 -0
- package/src/services/voice/audio-frame-consumer.d.ts +212 -0
- package/src/services/voice/audio-frame-consumer.d.ts.map +1 -0
- package/src/services/voice/audio-frame-consumer.test.ts +343 -0
- package/src/services/voice/audio-frame-consumer.ts +491 -0
- package/src/services/voice/barge-in.d.ts +112 -0
- package/src/services/voice/barge-in.d.ts.map +1 -0
- package/src/services/voice/barge-in.test.ts +244 -0
- package/src/services/voice/barge-in.ts +336 -0
- package/src/services/voice/cancellation-coordinator.d.ts +127 -0
- package/src/services/voice/cancellation-coordinator.d.ts.map +1 -0
- package/src/services/voice/cancellation-coordinator.test.ts +196 -0
- package/src/services/voice/cancellation-coordinator.ts +269 -0
- package/src/services/voice/checkpoint-manager.d.ts +199 -0
- package/src/services/voice/checkpoint-manager.d.ts.map +1 -0
- package/src/services/voice/checkpoint-manager.ts +401 -0
- package/src/services/voice/checkpoint-policy.ts +336 -0
- package/src/services/voice/composite-eot-classifier.test.ts +59 -0
- package/src/services/voice/e2e-harness.test.ts +182 -0
- package/src/services/voice/e2e-harness.ts +743 -0
- package/src/services/voice/eager-context-builder.d.ts +170 -0
- package/src/services/voice/eager-context-builder.d.ts.map +1 -0
- package/src/services/voice/eager-context-builder.ts +262 -0
- package/src/services/voice/eliza1-eot-scorer.d.ts +124 -0
- package/src/services/voice/eliza1-eot-scorer.d.ts.map +1 -0
- package/src/services/voice/eliza1-eot-scorer.ts +242 -0
- package/src/services/voice/embedding-server.ts +200 -0
- package/src/services/voice/embedding.d.ts +133 -0
- package/src/services/voice/embedding.d.ts.map +1 -0
- package/src/services/voice/embedding.test.ts +148 -0
- package/src/services/voice/embedding.ts +244 -0
- package/src/services/voice/emotion-attribution.d.ts +68 -0
- package/src/services/voice/emotion-attribution.d.ts.map +1 -0
- package/src/services/voice/emotion-attribution.test.ts +129 -0
- package/src/services/voice/emotion-attribution.ts +361 -0
- package/src/services/voice/engine-bridge-cancellation.test.ts +422 -0
- package/src/services/voice/engine-bridge.d.ts +746 -0
- package/src/services/voice/engine-bridge.d.ts.map +1 -0
- package/src/services/voice/engine-bridge.test.ts +384 -0
- package/src/services/voice/engine-bridge.ts +2226 -0
- package/src/services/voice/eot-classifier-ggml.d.ts +179 -0
- package/src/services/voice/eot-classifier-ggml.d.ts.map +1 -0
- package/src/services/voice/eot-classifier-ggml.ts +566 -0
- package/src/services/voice/eot-classifier.d.ts +214 -0
- package/src/services/voice/eot-classifier.d.ts.map +1 -0
- package/src/services/voice/eot-classifier.ts +533 -0
- package/src/services/voice/errors.d.ts +20 -0
- package/src/services/voice/errors.d.ts.map +1 -0
- package/src/services/voice/errors.ts +32 -0
- package/src/services/voice/expressive-tags.d.ts +158 -0
- package/src/services/voice/expressive-tags.d.ts.map +1 -0
- package/src/services/voice/expressive-tags.ts +405 -0
- package/src/services/voice/ffi-bindings.d.ts +636 -0
- package/src/services/voice/ffi-bindings.d.ts.map +1 -0
- package/src/services/voice/ffi-bindings.test.ts +671 -0
- package/src/services/voice/ffi-bindings.ts +3050 -0
- package/src/services/voice/first-line-cache.d.ts +181 -0
- package/src/services/voice/first-line-cache.d.ts.map +1 -0
- package/src/services/voice/first-line-cache.ts +725 -0
- package/src/services/voice/fused-eot-scorer.d.ts +51 -0
- package/src/services/voice/fused-eot-scorer.d.ts.map +1 -0
- package/src/services/voice/fused-eot-scorer.ts +135 -0
- package/src/services/voice/index.d.ts +91 -0
- package/src/services/voice/index.d.ts.map +1 -0
- package/src/services/voice/index.ts +481 -0
- package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +151 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +151 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.test.ts +60 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-discovery.test.ts +277 -0
- package/src/services/voice/kokoro/__tests__/kokoro-ffi-runtime.test.ts +235 -0
- package/src/services/voice/kokoro/__tests__/kokoro-runtime.test.ts +95 -0
- package/src/services/voice/kokoro/__tests__/phonemizer.test.ts +53 -0
- package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +231 -0
- package/src/services/voice/kokoro/__tests__/voices.test.ts +57 -0
- package/src/services/voice/kokoro/index.ts +79 -0
- package/src/services/voice/kokoro/kokoro-backend.d.ts +72 -0
- package/src/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-backend.ts +207 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts +58 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.ts +177 -0
- package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts +75 -0
- package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +233 -0
- package/src/services/voice/kokoro/kokoro-runtime.d.ts +100 -0
- package/src/services/voice/kokoro/kokoro-runtime.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-runtime.ts +170 -0
- package/src/services/voice/kokoro/phoneme-stream.ts +123 -0
- package/src/services/voice/kokoro/phonemizer.d.ts +50 -0
- package/src/services/voice/kokoro/phonemizer.d.ts.map +1 -0
- package/src/services/voice/kokoro/phonemizer.ts +344 -0
- package/src/services/voice/kokoro/pick-runtime.d.ts +61 -0
- package/src/services/voice/kokoro/pick-runtime.d.ts.map +1 -0
- package/src/services/voice/kokoro/pick-runtime.test.ts +91 -0
- package/src/services/voice/kokoro/pick-runtime.ts +130 -0
- package/src/services/voice/kokoro/runtime-selection.d.ts +92 -0
- package/src/services/voice/kokoro/runtime-selection.d.ts.map +1 -0
- package/src/services/voice/kokoro/runtime-selection.ts +237 -0
- package/src/services/voice/kokoro/types.d.ts +82 -0
- package/src/services/voice/kokoro/types.d.ts.map +1 -0
- package/src/services/voice/kokoro/types.ts +95 -0
- package/src/services/voice/kokoro/voice-presets.d.ts +23 -0
- package/src/services/voice/kokoro/voice-presets.d.ts.map +1 -0
- package/src/services/voice/kokoro/voice-presets.ts +129 -0
- package/src/services/voice/kokoro/voices.d.ts +30 -0
- package/src/services/voice/kokoro/voices.d.ts.map +1 -0
- package/src/services/voice/kokoro/voices.ts +64 -0
- package/src/services/voice/lifecycle.d.ts +135 -0
- package/src/services/voice/lifecycle.d.ts.map +1 -0
- package/src/services/voice/lifecycle.test.ts +315 -0
- package/src/services/voice/lifecycle.ts +301 -0
- package/src/services/voice/live-diarization-session.d.ts +96 -0
- package/src/services/voice/live-diarization-session.d.ts.map +1 -0
- package/src/services/voice/live-diarization-session.ts +289 -0
- package/src/services/voice/mic-source.d.ts +136 -0
- package/src/services/voice/mic-source.d.ts.map +1 -0
- package/src/services/voice/mic-source.test.ts +210 -0
- package/src/services/voice/mic-source.ts +503 -0
- package/src/services/voice/optimistic-policy.d.ts +109 -0
- package/src/services/voice/optimistic-policy.d.ts.map +1 -0
- package/src/services/voice/optimistic-policy.test.ts +101 -0
- package/src/services/voice/optimistic-policy.ts +192 -0
- package/src/services/voice/optimistic-rollback.ts +343 -0
- package/src/services/voice/partial-stabilizer.d.ts +73 -0
- package/src/services/voice/partial-stabilizer.d.ts.map +1 -0
- package/src/services/voice/partial-stabilizer.test.ts +68 -0
- package/src/services/voice/partial-stabilizer.ts +140 -0
- package/src/services/voice/phoneme-tokenizer.d.ts +49 -0
- package/src/services/voice/phoneme-tokenizer.d.ts.map +1 -0
- package/src/services/voice/phoneme-tokenizer.ts +158 -0
- package/src/services/voice/phrase-cache.d.ts +76 -0
- package/src/services/voice/phrase-cache.d.ts.map +1 -0
- package/src/services/voice/phrase-cache.test.ts +242 -0
- package/src/services/voice/phrase-cache.ts +186 -0
- package/src/services/voice/phrase-chunker.d.ts +62 -0
- package/src/services/voice/phrase-chunker.d.ts.map +1 -0
- package/src/services/voice/phrase-chunker.test.ts +239 -0
- package/src/services/voice/phrase-chunker.ts +281 -0
- package/src/services/voice/pipeline-impls.d.ts +151 -0
- package/src/services/voice/pipeline-impls.d.ts.map +1 -0
- package/src/services/voice/pipeline-impls.l6.test.ts +110 -0
- package/src/services/voice/pipeline-impls.test.ts +292 -0
- package/src/services/voice/pipeline-impls.ts +315 -0
- package/src/services/voice/pipeline.d.ts +216 -0
- package/src/services/voice/pipeline.d.ts.map +1 -0
- package/src/services/voice/pipeline.ts +505 -0
- package/src/services/voice/prefill-client.d.ts +123 -0
- package/src/services/voice/prefill-client.d.ts.map +1 -0
- package/src/services/voice/prefill-client.ts +316 -0
- package/src/services/voice/prefix-preserving-queue.d.ts +113 -0
- package/src/services/voice/prefix-preserving-queue.d.ts.map +1 -0
- package/src/services/voice/prefix-preserving-queue.ts +162 -0
- package/src/services/voice/profile-store.d.ts +248 -0
- package/src/services/voice/profile-store.d.ts.map +1 -0
- package/src/services/voice/profile-store.ts +887 -0
- package/src/services/voice/ring-buffer.d.ts +40 -0
- package/src/services/voice/ring-buffer.d.ts.map +1 -0
- package/src/services/voice/ring-buffer.ts +105 -0
- package/src/services/voice/rollback-queue.d.ts +24 -0
- package/src/services/voice/rollback-queue.d.ts.map +1 -0
- package/src/services/voice/rollback-queue.ts +74 -0
- package/src/services/voice/samantha-preset-placeholder.d.ts +67 -0
- package/src/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
- package/src/services/voice/samantha-preset-placeholder.test.ts +97 -0
- package/src/services/voice/samantha-preset-placeholder.ts +148 -0
- package/src/services/voice/samantha-preset-regenerator.d.ts +87 -0
- package/src/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
- package/src/services/voice/samantha-preset-regenerator.ts +393 -0
- package/src/services/voice/scheduler.d.ts +146 -0
- package/src/services/voice/scheduler.d.ts.map +1 -0
- package/src/services/voice/scheduler.t2.test.ts +141 -0
- package/src/services/voice/scheduler.ts +927 -0
- package/src/services/voice/shared-resources.d.ts +190 -0
- package/src/services/voice/shared-resources.d.ts.map +1 -0
- package/src/services/voice/shared-resources.ts +320 -0
- package/src/services/voice/speaker/attribution-pipeline.d.ts +74 -0
- package/src/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
- package/src/services/voice/speaker/attribution-pipeline.ts +386 -0
- package/src/services/voice/speaker/diarizer-fused.d.ts +59 -0
- package/src/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
- package/src/services/voice/speaker/diarizer-fused.real.test.ts +100 -0
- package/src/services/voice/speaker/diarizer-fused.ts +154 -0
- package/src/services/voice/speaker/diarizer.d.ts +75 -0
- package/src/services/voice/speaker/diarizer.d.ts.map +1 -0
- package/src/services/voice/speaker/diarizer.ts +218 -0
- package/src/services/voice/speaker/encoder-fused.d.ts +60 -0
- package/src/services/voice/speaker/encoder-fused.d.ts.map +1 -0
- package/src/services/voice/speaker/encoder-fused.real.test.ts +113 -0
- package/src/services/voice/speaker/encoder-fused.ts +138 -0
- package/src/services/voice/speaker/encoder-ggml.d.ts +33 -0
- package/src/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
- package/src/services/voice/speaker/encoder-ggml.ts +79 -0
- package/src/services/voice/speaker/encoder.d.ts +37 -0
- package/src/services/voice/speaker/encoder.d.ts.map +1 -0
- package/src/services/voice/speaker/encoder.ts +105 -0
- package/src/services/voice/speaker-imprint.d.ts +83 -0
- package/src/services/voice/speaker-imprint.d.ts.map +1 -0
- package/src/services/voice/speaker-imprint.test.ts +185 -0
- package/src/services/voice/speaker-imprint.ts +312 -0
- package/src/services/voice/speaker-preset-cache.d.ts +77 -0
- package/src/services/voice/speaker-preset-cache.d.ts.map +1 -0
- package/src/services/voice/speaker-preset-cache.test.ts +154 -0
- package/src/services/voice/speaker-preset-cache.ts +195 -0
- package/src/services/voice/streaming-asr/streaming-pipeline-adapter.ts +292 -0
- package/src/services/voice/system-audio-sink.d.ts +73 -0
- package/src/services/voice/system-audio-sink.d.ts.map +1 -0
- package/src/services/voice/system-audio-sink.test.ts +29 -0
- package/src/services/voice/system-audio-sink.ts +366 -0
- package/src/services/voice/transcriber.d.ts +244 -0
- package/src/services/voice/transcriber.d.ts.map +1 -0
- package/src/services/voice/transcriber.test.ts +392 -0
- package/src/services/voice/transcriber.ts +704 -0
- package/src/services/voice/turn-controller.d.ts +183 -0
- package/src/services/voice/turn-controller.d.ts.map +1 -0
- package/src/services/voice/turn-controller.test.ts +575 -0
- package/src/services/voice/turn-controller.ts +596 -0
- package/src/services/voice/types.d.ts +643 -0
- package/src/services/voice/types.d.ts.map +1 -0
- package/src/services/voice/types.ts +699 -0
- package/src/services/voice/vad.d.ts +282 -0
- package/src/services/voice/vad.d.ts.map +1 -0
- package/src/services/voice/vad.test.ts +480 -0
- package/src/services/voice/vad.ts +827 -0
- package/src/services/voice/vad.v1-v4.test.ts +222 -0
- package/src/services/voice/voice-budget.d.ts +241 -0
- package/src/services/voice/voice-budget.d.ts.map +1 -0
- package/src/services/voice/voice-budget.test.ts +420 -0
- package/src/services/voice/voice-budget.ts +656 -0
- package/src/services/voice/voice-duet.test.ts +375 -0
- package/src/services/voice/voice-emotion-classifier.d.ts +95 -0
- package/src/services/voice/voice-emotion-classifier.d.ts.map +1 -0
- package/src/services/voice/voice-emotion-classifier.test.ts +210 -0
- package/src/services/voice/voice-emotion-classifier.ts +273 -0
- package/src/services/voice/voice-preset-format.d.ts +158 -0
- package/src/services/voice/voice-preset-format.d.ts.map +1 -0
- package/src/services/voice/voice-preset-format.ts +700 -0
- package/src/services/voice/voice-preset-generator.test.ts +89 -0
- package/src/services/voice/voice-profile-artifact.d.ts +116 -0
- package/src/services/voice/voice-profile-artifact.d.ts.map +1 -0
- package/src/services/voice/voice-profile-artifact.test.ts +138 -0
- package/src/services/voice/voice-profile-artifact.ts +518 -0
- package/src/services/voice/voice-profile-routes.d.ts +83 -0
- package/src/services/voice/voice-profile-routes.d.ts.map +1 -0
- package/src/services/voice/voice-profile-routes.test.ts +429 -0
- package/src/services/voice/voice-profile-routes.ts +425 -0
- package/src/services/voice/voice-scenario.ts +154 -0
- package/src/services/voice/voice-settings.d.ts +82 -0
- package/src/services/voice/voice-settings.d.ts.map +1 -0
- package/src/services/voice/voice-settings.ts +172 -0
- package/src/services/voice/voice-state-machine.d.ts +364 -0
- package/src/services/voice/voice-state-machine.d.ts.map +1 -0
- package/src/services/voice/voice-state-machine.ts +727 -0
- package/src/services/voice/voice-workbench-report.test.ts +168 -0
- package/src/services/voice/voice-workbench-report.ts +326 -0
- package/src/services/voice/voice-workbench.test.ts +158 -0
- package/src/services/voice/voice.test.ts +1070 -0
- package/src/services/voice/wake-word-ggml.d.ts +101 -0
- package/src/services/voice/wake-word-ggml.d.ts.map +1 -0
- package/src/services/voice/wake-word-ggml.ts +320 -0
- package/src/services/voice/wake-word.d.ts +255 -0
- package/src/services/voice/wake-word.d.ts.map +1 -0
- package/src/services/voice/wake-word.test.ts +298 -0
- package/src/services/voice/wake-word.ts +554 -0
- package/src/services/voice/wrap-with-first-line-cache.d.ts +70 -0
- package/src/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
- package/src/services/voice/wrap-with-first-line-cache.ts +267 -0
- package/src/services/voice-model-updater.d.ts +240 -0
- package/src/services/voice-model-updater.d.ts.map +1 -0
- package/src/services/voice-model-updater.ts +724 -0
- package/src/services/voice-prewarm.d.ts +3 -0
- package/src/services/voice-prewarm.d.ts.map +1 -0
- package/src/services/voice-prewarm.ts +51 -0
- package/dist/index.d.ts +0 -37
- package/dist/index.js +0 -1098
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local text-to-speech capability — public type surface.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the layout of `services/imagegen/types.ts` and `services/vision/types.ts`:
|
|
5
|
+
*
|
|
6
|
+
* - The **request/result** contract every TTS backend implements
|
|
7
|
+
* (`TtsRequest`, `TtsResult`). The synth target is bytes (PCM/WAV/MP3).
|
|
8
|
+
*
|
|
9
|
+
* - The **backend** interface (`TtsBackend`) that the WS1 `MemoryArbiter`
|
|
10
|
+
* registers as the `"speak"` capability handler. One backend per
|
|
11
|
+
* per-platform TTS runtime:
|
|
12
|
+
*
|
|
13
|
+
* - `omnivoice` — fused omnivoice.cpp llama-server (desktop + AOSP)
|
|
14
|
+
* and the FFI streaming path (mobile). Default for tiers 9b / 27b
|
|
15
|
+
* / 27b-256k and a co-default for 9b.
|
|
16
|
+
* - `kokoro` — Kokoro-82M ONNX/GGUF. Default for tiers 0_8b / 2b
|
|
17
|
+
* / 4b (the low-memory mobile floor). Co-default for 9b.
|
|
18
|
+
* - `edge-tts` — Microsoft Edge cloud TTS, wired by
|
|
19
|
+
* `@elizaos/plugin-edge-tts`. Fallback when both local backends
|
|
20
|
+
* are unavailable (no GPU, missing weights). Routed via priority
|
|
21
|
+
* order in the runtime model registry, NOT as a sub-backend of
|
|
22
|
+
* this capability — Edge TTS is a different `provider` from the
|
|
23
|
+
* runtime's perspective.
|
|
24
|
+
* - `fake` — deterministic in-process backend used by tests.
|
|
25
|
+
*
|
|
26
|
+
* Audio format contract:
|
|
27
|
+
* The arbiter's `speak` request returns Uint8Array. The bytes carry the
|
|
28
|
+
* audio container declared in `TtsResult.mime`:
|
|
29
|
+
* - `audio/wav` — PCM in a RIFF/WAVE container (OmniVoice path
|
|
30
|
+
* produces 24 kHz mono int16 by default).
|
|
31
|
+
* - `audio/mpeg` — MP3 (Edge TTS default).
|
|
32
|
+
* - `audio/pcm-f32` — bare 32-bit float PCM. Used internally between
|
|
33
|
+
* Kokoro's runtime and the streaming sink; the
|
|
34
|
+
* capability layer wraps it as WAV before
|
|
35
|
+
* returning to TEXT_TO_SPEECH callers.
|
|
36
|
+
*
|
|
37
|
+
* Cache namespace:
|
|
38
|
+
* `tts-audio`. Keyed on `sha256(provider || model || voice || text)`.
|
|
39
|
+
* The first-line cache (`services/voice/wrap-with-first-line-cache.ts`)
|
|
40
|
+
* uses its own keying space and lives at a different layer; the
|
|
41
|
+
* capability-level cache (when wired) sits between the arbiter and the
|
|
42
|
+
* backend so it works for both local backends without each having to
|
|
43
|
+
* re-implement it.
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
/** Audio container the backend returns. */
|
|
47
|
+
export type TtsMimeType =
|
|
48
|
+
| "audio/wav"
|
|
49
|
+
| "audio/mpeg"
|
|
50
|
+
| "audio/pcm-f32"
|
|
51
|
+
| "audio/opus";
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Caller request to `synthesize`. `text` is mandatory; everything else is
|
|
55
|
+
* optional with backend-specific defaults.
|
|
56
|
+
*
|
|
57
|
+
* Knob semantics (consistent across backends):
|
|
58
|
+
* - `voice`: voice id. Kokoro uses ids like `"af_bella"`; OmniVoice uses
|
|
59
|
+
* a preset path / preset id from the speaker-preset store. Edge TTS
|
|
60
|
+
* uses Microsoft voice names (`"en-US-JennyNeural"`).
|
|
61
|
+
* - `speed`: speech rate. `1.0` is normal; `0.5` half; `2.0` double. The
|
|
62
|
+
* concrete backend maps this to its native knob (Edge TTS percentage
|
|
63
|
+
* string; Kokoro phoneme stretch; OmniVoice maskgit-step pacing).
|
|
64
|
+
* - `sampleRate`: target output sample rate when the container supports
|
|
65
|
+
* it. Backends MAY downsample / upsample to match; omitted = backend
|
|
66
|
+
* native (24 kHz for Kokoro and Edge TTS; 22.05 kHz for OmniVoice).
|
|
67
|
+
* - `signal`: abort hook. Backends honor this at chunk boundaries.
|
|
68
|
+
*/
|
|
69
|
+
export interface TtsRequest {
|
|
70
|
+
text: string;
|
|
71
|
+
voice?: string;
|
|
72
|
+
speed?: number;
|
|
73
|
+
sampleRate?: number;
|
|
74
|
+
/** Hint to the backend that the caller wants streaming chunks. */
|
|
75
|
+
streaming?: boolean;
|
|
76
|
+
signal?: AbortSignal;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Backend response. `audio` is the raw bytes in the container declared by
|
|
81
|
+
* `mime`. `sampleRate` reports the *actual* sample rate the bytes carry
|
|
82
|
+
* (which may differ from the requested `sampleRate` if the backend chose
|
|
83
|
+
* its native rate).
|
|
84
|
+
*/
|
|
85
|
+
export interface TtsResult {
|
|
86
|
+
audio: Uint8Array;
|
|
87
|
+
mime: TtsMimeType;
|
|
88
|
+
sampleRate: number;
|
|
89
|
+
metadata: {
|
|
90
|
+
/** The model id (catalog key) the run used (`"tts-omnivoice-base-Q8_0"`, `"tts-kokoro"`, etc.). */
|
|
91
|
+
model: string;
|
|
92
|
+
/** Resolved voice id (post-default-resolve). */
|
|
93
|
+
voice: string;
|
|
94
|
+
/** Echo of the text that was synthesized. */
|
|
95
|
+
text: string;
|
|
96
|
+
/** End-to-end wall-clock time inside the backend. */
|
|
97
|
+
inferenceTimeMs: number;
|
|
98
|
+
/** Whether the result came from the capability-level cache. */
|
|
99
|
+
cacheHit?: boolean;
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Per-load arguments for a TTS backend. The arbiter's `load(modelKey)`
|
|
105
|
+
* only carries an opaque key; the binding resolves it to real
|
|
106
|
+
* model+tokenizer+voice-preset paths through this struct, which
|
|
107
|
+
* `createTtsCapabilityRegistration` populates from the catalog +
|
|
108
|
+
* `ELIZA_1_GGUF_PLATFORM_PLAN.json`.
|
|
109
|
+
*
|
|
110
|
+
* The optional `voicePresetPath` exists because the runtime's default
|
|
111
|
+
* voice ships as a precomputed `cache/voice-preset-default.bin` (ELZ2
|
|
112
|
+
* v2). Backends that can use a frozen preset short-circuit the encoder
|
|
113
|
+
* pass; backends that can't ignore the hint.
|
|
114
|
+
*/
|
|
115
|
+
export interface TtsLoadArgs {
|
|
116
|
+
/** Absolute path to the primary TTS weights (GGUF for OmniVoice, ONNX for Kokoro). */
|
|
117
|
+
modelPath: string;
|
|
118
|
+
/** Optional tokenizer path (OmniVoice ships a separate `omnivoice-tokenizer-*.gguf`). */
|
|
119
|
+
tokenizerPath?: string;
|
|
120
|
+
/** Optional voice-preset cache path (`cache/voice-preset-default.bin`). */
|
|
121
|
+
voicePresetPath?: string;
|
|
122
|
+
/** Optional voice pack directory (Kokoro `voices/af_bella.bin`, etc.). */
|
|
123
|
+
voicePackDir?: string;
|
|
124
|
+
/** Cancel a slow load (model file read + weight upload). */
|
|
125
|
+
signal?: AbortSignal;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* The contract every TTS backend implements. The shape is intentionally
|
|
130
|
+
* narrow: the arbiter only ever calls `synthesize`. `dispose` is wrapped
|
|
131
|
+
* by the arbiter's `unload` so the backend can free GPU/VRAM and drop
|
|
132
|
+
* file descriptors / kill subprocesses on eviction.
|
|
133
|
+
*/
|
|
134
|
+
export interface TtsBackend {
|
|
135
|
+
/** Stable identifier — matches the backend module name. */
|
|
136
|
+
readonly id: "omnivoice" | "kokoro" | "edge-tts" | "fake";
|
|
137
|
+
/**
|
|
138
|
+
* Best-effort capability check. Backends return `false` for requests
|
|
139
|
+
* whose `voice` / `sampleRate` aren't supported, so the arbiter can
|
|
140
|
+
* surface a clear error rather than synthesizing garbage. Default
|
|
141
|
+
* implementations accept anything reasonable; the gate matters for
|
|
142
|
+
* Kokoro (fixed voice pack list) and OmniVoice (cloned-voice presets
|
|
143
|
+
* tied to a specific bundle).
|
|
144
|
+
*/
|
|
145
|
+
supports(request: TtsRequest): boolean;
|
|
146
|
+
synthesize(request: TtsRequest): Promise<TtsResult>;
|
|
147
|
+
/** Release the loaded weights / subprocess. Idempotent. */
|
|
148
|
+
dispose(): Promise<void>;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Capability handler loader. The arbiter calls it with a model key (e.g.
|
|
153
|
+
* `"tts-omnivoice-base-Q8_0"`); the implementation resolves to a real
|
|
154
|
+
* `TtsLoadArgs` from `ELIZA_1_GGUF_PLATFORM_PLAN.json` + the installed
|
|
155
|
+
* bundle and returns a live backend.
|
|
156
|
+
*/
|
|
157
|
+
export type TtsBackendLoader = (modelKey: string) => Promise<TtsBackend>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local inference type re-exports.
|
|
3
|
+
*
|
|
4
|
+
* The canonical definitions live in `@elizaos/shared/local-inference`.
|
|
5
|
+
* This shim preserves the historical import path
|
|
6
|
+
* `../services/local-inference/types` for server-side code.
|
|
7
|
+
*/
|
|
8
|
+
export { type ActiveModelState, AGENT_MODEL_SLOTS, type AgentModelSlot, type CatalogModel, type CatalogQuantizationId, type CatalogQuantizationMatrix, type CatalogQuantizationVariant, type CpuFeatureProbe, type DownloadEvent, type DownloadJob, type DownloadState, type GpuProfile, type GpuProfileId, type HardwareFitLevel, type HardwareProbe, type InstalledModel, type KvCacheType, type LocalInferenceDownloadStatus, type LocalInferenceReadiness, type LocalInferenceSlotReadiness, type LocalRuntimeAcceleration, type LocalRuntimeBackend, type LocalRuntimeKernel, type LocalRuntimeOptimizations, type MobileHardwareProbe, type ModelAssignments, type ModelBucket, type ModelCategory, type ModelHubSnapshot, type OpenVinoDeviceKind, type OpenVinoHardwareProbe, TEXT_GENERATION_SLOTS, type TextGenerationSlot, type TokenizerFamily, } from "@elizaos/shared";
|
|
9
|
+
/** RAM requirements for a model bundle. */
|
|
10
|
+
export interface RamBudget {
|
|
11
|
+
/** Minimum RAM the bundle will boot under, in megabytes. */
|
|
12
|
+
minMb: number;
|
|
13
|
+
/** RAM the bundle expects for nominal workloads, in megabytes. */
|
|
14
|
+
recommendedMb: number;
|
|
15
|
+
/** Where the numbers came from. `manifest` only when both came from
|
|
16
|
+
* a validated `eliza-1.manifest.json` next to the installed bundle. */
|
|
17
|
+
source: "manifest" | "catalog";
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACN,KAAK,gBAAgB,EACrB,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,4BAA4B,EACjC,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,eAAe,GACpB,MAAM,iBAAiB,CAAC;AAEzB,2CAA2C;AAC3C,MAAM,WAAW,SAAS;IACzB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,aAAa,EAAE,MAAM,CAAC;IACtB;4EACwE;IACxE,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;CAC/B"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local inference type re-exports.
|
|
3
|
+
*
|
|
4
|
+
* The canonical definitions live in `@elizaos/shared/local-inference`.
|
|
5
|
+
* This shim preserves the historical import path
|
|
6
|
+
* `../services/local-inference/types` for server-side code.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export {
|
|
10
|
+
type ActiveModelState,
|
|
11
|
+
AGENT_MODEL_SLOTS,
|
|
12
|
+
type AgentModelSlot,
|
|
13
|
+
type CatalogModel,
|
|
14
|
+
type CatalogQuantizationId,
|
|
15
|
+
type CatalogQuantizationMatrix,
|
|
16
|
+
type CatalogQuantizationVariant,
|
|
17
|
+
type CpuFeatureProbe,
|
|
18
|
+
type DownloadEvent,
|
|
19
|
+
type DownloadJob,
|
|
20
|
+
type DownloadState,
|
|
21
|
+
type GpuProfile,
|
|
22
|
+
type GpuProfileId,
|
|
23
|
+
type HardwareFitLevel,
|
|
24
|
+
type HardwareProbe,
|
|
25
|
+
type InstalledModel,
|
|
26
|
+
type KvCacheType,
|
|
27
|
+
type LocalInferenceDownloadStatus,
|
|
28
|
+
type LocalInferenceReadiness,
|
|
29
|
+
type LocalInferenceSlotReadiness,
|
|
30
|
+
type LocalRuntimeAcceleration,
|
|
31
|
+
type LocalRuntimeBackend,
|
|
32
|
+
type LocalRuntimeKernel,
|
|
33
|
+
type LocalRuntimeOptimizations,
|
|
34
|
+
type MobileHardwareProbe,
|
|
35
|
+
type ModelAssignments,
|
|
36
|
+
type ModelBucket,
|
|
37
|
+
type ModelCategory,
|
|
38
|
+
type ModelHubSnapshot,
|
|
39
|
+
type OpenVinoDeviceKind,
|
|
40
|
+
type OpenVinoHardwareProbe,
|
|
41
|
+
TEXT_GENERATION_SLOTS,
|
|
42
|
+
type TextGenerationSlot,
|
|
43
|
+
type TokenizerFamily,
|
|
44
|
+
} from "@elizaos/shared";
|
|
45
|
+
|
|
46
|
+
/** RAM requirements for a model bundle. */
|
|
47
|
+
export interface RamBudget {
|
|
48
|
+
/** Minimum RAM the bundle will boot under, in megabytes. */
|
|
49
|
+
minMb: number;
|
|
50
|
+
/** RAM the bundle expects for nominal workloads, in megabytes. */
|
|
51
|
+
recommendedMb: number;
|
|
52
|
+
/** Where the numbers came from. `manifest` only when both came from
|
|
53
|
+
* a validated `eliza-1.manifest.json` next to the installed bundle. */
|
|
54
|
+
source: "manifest" | "catalog";
|
|
55
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine-backed `verifyOnDevice` hook for the Eliza-1 downloader
|
|
3
|
+
* (`packages/inference/AGENTS.md` §7): after a bundle is materialized and
|
|
4
|
+
* every file's sha256 checks out, run one cold smoke pass —
|
|
5
|
+
*
|
|
6
|
+
* load → 1-token text generation → (if the bundle ships voice assets)
|
|
7
|
+
* 1-phrase voice generation → barge-in cancel → unload
|
|
8
|
+
*
|
|
9
|
+
* — before the bundle is allowed to auto-fill an empty default slot. The
|
|
10
|
+
* downloader stays decoupled from the engine: it only knows the
|
|
11
|
+
* {@link VerifyBundleOnDevice} shape; this module is the concrete
|
|
12
|
+
* implementation the service layer injects.
|
|
13
|
+
*
|
|
14
|
+
* Failure semantics: any error throws. The downloader catches it and leaves
|
|
15
|
+
* `bundleVerifiedAt` unset, so an unverified bundle is registered but does
|
|
16
|
+
* not become the recommended default. There is no "verified anyway" path —
|
|
17
|
+
* voice is mandatory for Eliza-1 voice tiers (AGENTS.md §3), so a bundle
|
|
18
|
+
* whose fused voice ABI is not loadable on this device legitimately fails
|
|
19
|
+
* verify until the fused build is present.
|
|
20
|
+
*/
|
|
21
|
+
import fs from "node:fs/promises";
|
|
22
|
+
import type { VerifyBundleOnDevice } from "./downloader";
|
|
23
|
+
import { localInferenceEngine } from "./engine";
|
|
24
|
+
import { parseManifestOrThrow } from "./manifest";
|
|
25
|
+
type VerifyEngine = Pick<typeof localInferenceEngine, "load" | "generate" | "ensureActiveBundleVoiceReady" | "startVoice" | "armVoice" | "synthesizeSpeech" | "triggerBargeIn" | "stopVoice" | "unload">;
|
|
26
|
+
interface VerifyBundleOnDeviceDeps {
|
|
27
|
+
readonly engine: VerifyEngine;
|
|
28
|
+
readonly readFile: typeof fs.readFile;
|
|
29
|
+
readonly parseManifest: typeof parseManifestOrThrow;
|
|
30
|
+
}
|
|
31
|
+
export declare function createVerifyBundleOnDevice(deps?: Partial<VerifyBundleOnDeviceDeps>): VerifyBundleOnDevice;
|
|
32
|
+
export declare const verifyBundleOnDevice: VerifyBundleOnDevice;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=verify-on-device.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-on-device.d.ts","sourceRoot":"","sources":["verify-on-device.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAOlD,KAAK,YAAY,GAAG,IAAI,CACvB,OAAO,oBAAoB,EACzB,MAAM,GACN,UAAU,GACV,8BAA8B,GAC9B,YAAY,GACZ,UAAU,GACV,kBAAkB,GAClB,gBAAgB,GAChB,WAAW,GACX,QAAQ,CACV,CAAC;AAEF,UAAU,wBAAwB;IACjC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,OAAO,oBAAoB,CAAC;CACpD;AAqDD,wBAAgB,0BAA0B,CACzC,IAAI,GAAE,OAAO,CAAC,wBAAwB,CAAM,GAC1C,oBAAoB,CAoBtB;AAED,eAAO,MAAM,oBAAoB,EAAE,oBACN,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { createVerifyBundleOnDevice } from "./verify-on-device";
|
|
3
|
+
|
|
4
|
+
const engineMock = {
|
|
5
|
+
load: vi.fn(async () => {}),
|
|
6
|
+
generate: vi.fn(async () => "ok"),
|
|
7
|
+
ensureActiveBundleVoiceReady: vi.fn(async () => ({})),
|
|
8
|
+
startVoice: vi.fn(() => {}),
|
|
9
|
+
armVoice: vi.fn(async () => {}),
|
|
10
|
+
synthesizeSpeech: vi.fn(async () => new Uint8Array([1, 2, 3, 4])),
|
|
11
|
+
triggerBargeIn: vi.fn(() => {}),
|
|
12
|
+
stopVoice: vi.fn(async () => {}),
|
|
13
|
+
unload: vi.fn(async () => {}),
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const manifestState: { voiceFiles: number } = { voiceFiles: 0 };
|
|
17
|
+
|
|
18
|
+
function verifier() {
|
|
19
|
+
const deps = {
|
|
20
|
+
engine: engineMock,
|
|
21
|
+
readFile: vi.fn(async () => "{}"),
|
|
22
|
+
parseManifest: () => ({
|
|
23
|
+
files: {
|
|
24
|
+
voice: Array.from({ length: manifestState.voiceFiles }, (_, i) => ({
|
|
25
|
+
path: `tts/v${i}.gguf`,
|
|
26
|
+
sha256: "x",
|
|
27
|
+
})),
|
|
28
|
+
},
|
|
29
|
+
}),
|
|
30
|
+
} as unknown as Parameters<typeof createVerifyBundleOnDevice>[0];
|
|
31
|
+
return createVerifyBundleOnDevice(deps);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const ARGS = {
|
|
35
|
+
modelId: "eliza-1-0_8b",
|
|
36
|
+
bundleRoot: "/tmp/bundle",
|
|
37
|
+
manifestPath: "/tmp/bundle/eliza-1.manifest.json",
|
|
38
|
+
textGgufPath: "/tmp/bundle/text/eliza-1-0_8b.gguf",
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
afterEach(() => {
|
|
42
|
+
vi.clearAllMocks();
|
|
43
|
+
manifestState.voiceFiles = 0;
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
describe("verifyBundleOnDevice", () => {
|
|
47
|
+
it("loads, runs a 1-token text gen, and unloads for a text-only bundle", async () => {
|
|
48
|
+
manifestState.voiceFiles = 0;
|
|
49
|
+
await verifier()(ARGS);
|
|
50
|
+
expect(engineMock.load).toHaveBeenCalledWith(ARGS.textGgufPath, {
|
|
51
|
+
modelPath: ARGS.textGgufPath,
|
|
52
|
+
modelId: ARGS.modelId,
|
|
53
|
+
});
|
|
54
|
+
expect(engineMock.generate).toHaveBeenCalledWith(
|
|
55
|
+
expect.objectContaining({ maxTokens: 1 }),
|
|
56
|
+
);
|
|
57
|
+
expect(engineMock.ensureActiveBundleVoiceReady).not.toHaveBeenCalled();
|
|
58
|
+
expect(engineMock.startVoice).not.toHaveBeenCalled();
|
|
59
|
+
expect(engineMock.unload).toHaveBeenCalled();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("also runs a 1-phrase voice gen + barge-in cancel when the bundle ships voice", async () => {
|
|
63
|
+
manifestState.voiceFiles = 1;
|
|
64
|
+
await verifier()(ARGS);
|
|
65
|
+
expect(engineMock.ensureActiveBundleVoiceReady).toHaveBeenCalled();
|
|
66
|
+
expect(engineMock.startVoice).not.toHaveBeenCalled();
|
|
67
|
+
expect(engineMock.armVoice).not.toHaveBeenCalled();
|
|
68
|
+
expect(engineMock.synthesizeSpeech).toHaveBeenCalled();
|
|
69
|
+
expect(engineMock.triggerBargeIn).toHaveBeenCalled();
|
|
70
|
+
expect(engineMock.stopVoice).toHaveBeenCalled();
|
|
71
|
+
expect(engineMock.unload).toHaveBeenCalled();
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("rethrows verify failures and still unloads", async () => {
|
|
75
|
+
manifestState.voiceFiles = 0;
|
|
76
|
+
engineMock.generate.mockRejectedValueOnce(new Error("kernel missing"));
|
|
77
|
+
await expect(verifier()(ARGS)).rejects.toThrow("kernel missing");
|
|
78
|
+
expect(engineMock.unload).toHaveBeenCalled();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it("fails verify when voice synthesis yields no PCM", async () => {
|
|
82
|
+
manifestState.voiceFiles = 1;
|
|
83
|
+
engineMock.synthesizeSpeech.mockResolvedValueOnce(new Uint8Array(0));
|
|
84
|
+
await expect(verifier()(ARGS)).rejects.toThrow(/no PCM bytes/);
|
|
85
|
+
expect(engineMock.stopVoice).toHaveBeenCalled();
|
|
86
|
+
});
|
|
87
|
+
});
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine-backed `verifyOnDevice` hook for the Eliza-1 downloader
|
|
3
|
+
* (`packages/inference/AGENTS.md` §7): after a bundle is materialized and
|
|
4
|
+
* every file's sha256 checks out, run one cold smoke pass —
|
|
5
|
+
*
|
|
6
|
+
* load → 1-token text generation → (if the bundle ships voice assets)
|
|
7
|
+
* 1-phrase voice generation → barge-in cancel → unload
|
|
8
|
+
*
|
|
9
|
+
* — before the bundle is allowed to auto-fill an empty default slot. The
|
|
10
|
+
* downloader stays decoupled from the engine: it only knows the
|
|
11
|
+
* {@link VerifyBundleOnDevice} shape; this module is the concrete
|
|
12
|
+
* implementation the service layer injects.
|
|
13
|
+
*
|
|
14
|
+
* Failure semantics: any error throws. The downloader catches it and leaves
|
|
15
|
+
* `bundleVerifiedAt` unset, so an unverified bundle is registered but does
|
|
16
|
+
* not become the recommended default. There is no "verified anyway" path —
|
|
17
|
+
* voice is mandatory for Eliza-1 voice tiers (AGENTS.md §3), so a bundle
|
|
18
|
+
* whose fused voice ABI is not loadable on this device legitimately fails
|
|
19
|
+
* verify until the fused build is present.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import fs from "node:fs/promises";
|
|
23
|
+
import type { VerifyBundleOnDevice } from "./downloader";
|
|
24
|
+
import { localInferenceEngine } from "./engine";
|
|
25
|
+
import { parseManifestOrThrow } from "./manifest";
|
|
26
|
+
|
|
27
|
+
/** A short, deterministic prompt — we only care that one token comes back. */
|
|
28
|
+
const VERIFY_PROMPT = "Reply with one word.";
|
|
29
|
+
/** A short phrase to drive a single TTS dispatch through the voice scheduler. */
|
|
30
|
+
const VERIFY_PHRASE = "Ready.";
|
|
31
|
+
|
|
32
|
+
type VerifyEngine = Pick<
|
|
33
|
+
typeof localInferenceEngine,
|
|
34
|
+
| "load"
|
|
35
|
+
| "generate"
|
|
36
|
+
| "ensureActiveBundleVoiceReady"
|
|
37
|
+
| "startVoice"
|
|
38
|
+
| "armVoice"
|
|
39
|
+
| "synthesizeSpeech"
|
|
40
|
+
| "triggerBargeIn"
|
|
41
|
+
| "stopVoice"
|
|
42
|
+
| "unload"
|
|
43
|
+
>;
|
|
44
|
+
|
|
45
|
+
interface VerifyBundleOnDeviceDeps {
|
|
46
|
+
readonly engine: VerifyEngine;
|
|
47
|
+
readonly readFile: typeof fs.readFile;
|
|
48
|
+
readonly parseManifest: typeof parseManifestOrThrow;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function manifestDeclaresVoice(
|
|
52
|
+
manifestPath: string,
|
|
53
|
+
deps: Pick<VerifyBundleOnDeviceDeps, "readFile" | "parseManifest">,
|
|
54
|
+
): Promise<boolean> {
|
|
55
|
+
const raw = await deps.readFile(manifestPath, "utf8");
|
|
56
|
+
const manifest = deps.parseManifest(JSON.parse(String(raw)));
|
|
57
|
+
// Voice tiers ship a TTS GGUF under `files.voice`; the ASR/VAD files are
|
|
58
|
+
// gated on top of that. If there is no voice file, this is a text-only
|
|
59
|
+
// bundle and the voice leg of the smoke is skipped.
|
|
60
|
+
return manifest.files.voice.length > 0;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function verifyText(
|
|
64
|
+
engine: VerifyEngine,
|
|
65
|
+
modelId: string,
|
|
66
|
+
textGgufPath: string,
|
|
67
|
+
): Promise<void> {
|
|
68
|
+
await engine.load(textGgufPath, { modelPath: textGgufPath, modelId });
|
|
69
|
+
const out = await engine.generate({
|
|
70
|
+
prompt: VERIFY_PROMPT,
|
|
71
|
+
maxTokens: 1,
|
|
72
|
+
temperature: 0,
|
|
73
|
+
});
|
|
74
|
+
if (typeof out !== "string") {
|
|
75
|
+
throw new Error(
|
|
76
|
+
`[verify-on-device] text generation returned ${typeof out}, expected string`,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function verifyVoice(
|
|
82
|
+
engine: VerifyEngine,
|
|
83
|
+
_bundleRoot: string,
|
|
84
|
+
): Promise<void> {
|
|
85
|
+
await engine.ensureActiveBundleVoiceReady();
|
|
86
|
+
try {
|
|
87
|
+
// One real synthesis through the voice bridge.
|
|
88
|
+
const pcm = await engine.synthesizeSpeech(VERIFY_PHRASE);
|
|
89
|
+
if (!(pcm instanceof Uint8Array) || pcm.byteLength === 0) {
|
|
90
|
+
throw new Error(
|
|
91
|
+
"[verify-on-device] voice synthesis produced no PCM bytes",
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
// Barge-in cancel must be accepted without throwing — exercises the
|
|
95
|
+
// hard-stop path the voice loop uses to abort speculative TTS.
|
|
96
|
+
engine.triggerBargeIn();
|
|
97
|
+
} finally {
|
|
98
|
+
await engine.stopVoice();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function createVerifyBundleOnDevice(
|
|
103
|
+
deps: Partial<VerifyBundleOnDeviceDeps> = {},
|
|
104
|
+
): VerifyBundleOnDevice {
|
|
105
|
+
const engine = deps.engine ?? localInferenceEngine;
|
|
106
|
+
const manifestDeps = {
|
|
107
|
+
readFile: deps.readFile ?? fs.readFile,
|
|
108
|
+
parseManifest: deps.parseManifest ?? parseManifestOrThrow,
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
return async ({ modelId, bundleRoot, manifestPath, textGgufPath }) => {
|
|
112
|
+
try {
|
|
113
|
+
await verifyText(engine, modelId, textGgufPath);
|
|
114
|
+
if (await manifestDeclaresVoice(manifestPath, manifestDeps)) {
|
|
115
|
+
await verifyVoice(engine, bundleRoot);
|
|
116
|
+
}
|
|
117
|
+
} finally {
|
|
118
|
+
// Always release the model the verify pass loaded — the bundle is not
|
|
119
|
+
// "active" yet, and the active-model coordinator owns load/unload from
|
|
120
|
+
// here on.
|
|
121
|
+
await engine.unload().catch(() => {});
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export const verifyBundleOnDevice: VerifyBundleOnDevice =
|
|
127
|
+
createVerifyBundleOnDevice();
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-export of the shared model-file verification module. The canonical
|
|
3
|
+
* implementation lives in `@elizaos/shared/local-inference` because both
|
|
4
|
+
* the server (`@elizaos/app-core`) and the UI client (`@elizaos/ui`)
|
|
5
|
+
* compute the same SHA256 / GGUF-magic checks against on-disk models.
|
|
6
|
+
*/
|
|
7
|
+
export { __registryPathForTests, hashFile, type VerifyResult, type VerifyState, verifyInstalledModel, } from "@elizaos/shared/local-inference/verify";
|
|
8
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["verify.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACN,sBAAsB,EACtB,QAAQ,EACR,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,oBAAoB,GACpB,MAAM,wCAAwC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-export of the shared model-file verification module. The canonical
|
|
3
|
+
* implementation lives in `@elizaos/shared/local-inference` because both
|
|
4
|
+
* the server (`@elizaos/app-core`) and the UI client (`@elizaos/ui`)
|
|
5
|
+
* compute the same SHA256 / GGUF-magic checks against on-disk models.
|
|
6
|
+
*/
|
|
7
|
+
export {
|
|
8
|
+
__registryPathForTests,
|
|
9
|
+
hashFile,
|
|
10
|
+
type VerifyResult,
|
|
11
|
+
type VerifyState,
|
|
12
|
+
verifyInstalledModel,
|
|
13
|
+
} from "@elizaos/shared/local-inference/verify";
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AOSP vision-describe backend contract (WS2).
|
|
3
|
+
*
|
|
4
|
+
* The bun:ffi llama.cpp binding in `@elizaos/plugin-aosp-local-inference`
|
|
5
|
+
* already exposes the embedding helpers (`llama_set_embeddings`,
|
|
6
|
+
* `llama_get_embeddings_seq`) and the model/context lifecycle. mtmd
|
|
7
|
+
* (multi-modal definition) is part of upstream llama.cpp from b8198+
|
|
8
|
+
* but the libeliza-llama-shim that the AOSP binding loads does NOT
|
|
9
|
+
* yet export the matching `eliza_llama_mtmd_*` symbols.
|
|
10
|
+
*
|
|
11
|
+
* This file is the JS contract for the FFI binding the AOSP plugin
|
|
12
|
+
* will add when the native side ships. It lives in
|
|
13
|
+
* `plugin-local-inference` (not in `plugin-aosp-local-inference`) so
|
|
14
|
+
* cross-plugin consumers can compile against the same interface
|
|
15
|
+
* regardless of platform. When the AOSP shim ships the native
|
|
16
|
+
* symbols, the implementation in `plugin-aosp-local-inference/src/
|
|
17
|
+
* aosp-llama-vision.ts` (to be added) will satisfy this contract.
|
|
18
|
+
*
|
|
19
|
+
* Required native symbols (libeliza-llama-shim):
|
|
20
|
+
*
|
|
21
|
+
* eliza_llama_mtmd_init_from_file(
|
|
22
|
+
* mmproj_path: const char *,
|
|
23
|
+
* out_handle: void **
|
|
24
|
+
* ) -> int32 // 0 = ok; non-zero = error code
|
|
25
|
+
*
|
|
26
|
+
* eliza_llama_mtmd_free(mtmd_handle: void *) -> void
|
|
27
|
+
*
|
|
28
|
+
* eliza_llama_mtmd_encode(
|
|
29
|
+
* mtmd_handle: void *,
|
|
30
|
+
* image_bytes: const uint8_t *,
|
|
31
|
+
* image_len: size_t,
|
|
32
|
+
* out_tokens_ptr: float **, // owned by mtmd; valid until next encode
|
|
33
|
+
* out_token_count: int32 *,
|
|
34
|
+
* out_hidden_size: int32 *
|
|
35
|
+
* ) -> int32
|
|
36
|
+
*
|
|
37
|
+
* eliza_llama_decode_with_mmproj(
|
|
38
|
+
* ctx: void *, // existing llama_context
|
|
39
|
+
* mtmd_tokens: const float *,
|
|
40
|
+
* mtmd_token_count: int32,
|
|
41
|
+
* mtmd_hidden_size: int32,
|
|
42
|
+
* prompt: const char *,
|
|
43
|
+
* prompt_len: size_t,
|
|
44
|
+
* max_tokens: int32,
|
|
45
|
+
* temperature: float,
|
|
46
|
+
* out_text_buf: char *, // caller-allocated
|
|
47
|
+
* out_text_buf_cap: size_t,
|
|
48
|
+
* out_text_written: size_t *
|
|
49
|
+
* ) -> int32
|
|
50
|
+
*
|
|
51
|
+
* Optional fast path: if the shim adds
|
|
52
|
+
*
|
|
53
|
+
* eliza_llama_mtmd_describe(
|
|
54
|
+
* model: void *, // existing llama_model
|
|
55
|
+
* ctx: void *, // existing llama_context
|
|
56
|
+
* mtmd_handle: void *,
|
|
57
|
+
* image_bytes: const uint8_t *,
|
|
58
|
+
* image_len: size_t,
|
|
59
|
+
* prompt: const char *,
|
|
60
|
+
* prompt_len: size_t,
|
|
61
|
+
* max_tokens: int32,
|
|
62
|
+
* temperature: float,
|
|
63
|
+
* out_buf: char *,
|
|
64
|
+
* out_buf_cap: size_t,
|
|
65
|
+
* out_written: size_t *
|
|
66
|
+
* ) -> int32
|
|
67
|
+
*
|
|
68
|
+
* that single-call wrapper is preferred — it lets the shim fuse the
|
|
69
|
+
* encode+decode steps internally and avoids the round-trip of token
|
|
70
|
+
* pointers across the FFI boundary (which bun:ffi handles, but at the
|
|
71
|
+
* cost of two extra pointer dereferences per frame).
|
|
72
|
+
*
|
|
73
|
+
* Until the native side exports those symbols, this module's `loadAospVisionBackend`
|
|
74
|
+
* throws a structured error that the arbiter / handler can surface as
|
|
75
|
+
* "vision not available on this platform". It does NOT register
|
|
76
|
+
* silently — silent unavailability would let the runtime fall back to
|
|
77
|
+
* the cloud path on a mobile device that explicitly disabled it.
|
|
78
|
+
*/
|
|
79
|
+
import type { VisionDescribeBackend, VisionDescribeLoadArgs } from "./types";
|
|
80
|
+
/**
|
|
81
|
+
* The AOSP binding's mtmd surface, when present. The AOSP plugin
|
|
82
|
+
* registers an instance under the runtime service name
|
|
83
|
+
* `"aosp-llama-mtmd"` once the native shim exports the symbols above.
|
|
84
|
+
*/
|
|
85
|
+
export interface AospLlamaMtmdBinding {
|
|
86
|
+
/** True when libeliza-llama-shim.so was loaded and exports the mtmd symbols. */
|
|
87
|
+
hasMtmd(): boolean;
|
|
88
|
+
/** Initialize an mtmd handle for the given mmproj path. */
|
|
89
|
+
initMtmd(args: {
|
|
90
|
+
mmprojPath: string;
|
|
91
|
+
}): Promise<AospMtmdHandle>;
|
|
92
|
+
}
|
|
93
|
+
export interface AospMtmdHandle {
|
|
94
|
+
/**
|
|
95
|
+
* Single-call describe — wraps mtmd_encode + decode_with_chunks. The
|
|
96
|
+
* AOSP shim's `eliza_llama_mtmd_describe` lands here. Backends that
|
|
97
|
+
* only have the split encode/decode symbols implement this on top
|
|
98
|
+
* of two FFI calls; backends with the fused symbol use one.
|
|
99
|
+
*/
|
|
100
|
+
describe(args: {
|
|
101
|
+
imageBytes: Uint8Array;
|
|
102
|
+
prompt: string;
|
|
103
|
+
maxTokens?: number;
|
|
104
|
+
temperature?: number;
|
|
105
|
+
signal?: AbortSignal;
|
|
106
|
+
}): Promise<string>;
|
|
107
|
+
/** Free the mtmd handle (and any cached encode buffers). */
|
|
108
|
+
dispose(): Promise<void>;
|
|
109
|
+
}
|
|
110
|
+
export interface LoadAospVisionBackendOptions {
|
|
111
|
+
loadArgs: VisionDescribeLoadArgs;
|
|
112
|
+
mtmdBinding?: AospLlamaMtmdBinding;
|
|
113
|
+
}
|
|
114
|
+
export declare function loadAospVisionBackend(opts: LoadAospVisionBackendOptions): Promise<VisionDescribeBackend>;
|
|
115
|
+
//# sourceMappingURL=aosp-unavailable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aosp-unavailable.d.ts","sourceRoot":"","sources":["aosp-unavailable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6EG;AAIH,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAE7E;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACpC,gFAAgF;IAChF,OAAO,IAAI,OAAO,CAAC;IACnB,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,cAAc;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE;QACd,UAAU,EAAE,UAAU,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,WAAW,CAAC;KACrB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpB,4DAA4D;IAC5D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,EAAE,sBAAsB,CAAC;IACjC,WAAW,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAED,wBAAsB,qBAAqB,CAC1C,IAAI,EAAE,4BAA4B,GAChC,OAAO,CAAC,qBAAqB,CAAC,CA0ChC"}
|