@elizaos/plugin-local-inference 2.0.0-beta.1 → 2.0.3-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +83 -0
- package/package.json +82 -15
- package/src/actions/generate-media.d.ts +59 -0
- package/src/actions/generate-media.d.ts.map +1 -0
- package/src/actions/generate-media.ts +647 -0
- package/src/actions/identify-speaker.d.ts +23 -0
- package/src/actions/identify-speaker.d.ts.map +1 -0
- package/src/actions/identify-speaker.ts +171 -0
- package/src/actions/transcription-control.d.ts +29 -0
- package/src/actions/transcription-control.d.ts.map +1 -0
- package/src/actions/transcription-control.test.ts +100 -0
- package/src/actions/transcription-control.ts +127 -0
- package/src/adapters/capacitor-llama/__tests__/compat-behavior.test.ts +218 -0
- package/src/adapters/capacitor-llama/__tests__/index.test.ts +68 -0
- package/src/adapters/capacitor-llama/__tests__/structured-output.test.ts +215 -0
- package/src/adapters/capacitor-llama/__tests__/text-streaming.test.ts +174 -0
- package/src/adapters/capacitor-llama/environment.ts +71 -0
- package/src/adapters/capacitor-llama/index.browser.ts +83 -0
- package/src/adapters/capacitor-llama/index.ts +807 -0
- package/src/adapters/capacitor-llama/loader.ts +109 -0
- package/src/adapters/capacitor-llama/structured-output.ts +165 -0
- package/src/adapters/capacitor-llama/text-streaming.ts +227 -0
- package/src/adapters/capacitor-llama/types.ts +374 -0
- package/src/backends/apple-foundation.ts +127 -0
- package/src/index.d.ts +8 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.ts +62 -0
- package/src/local-inference-routes.d.ts +38 -0
- package/src/local-inference-routes.d.ts.map +1 -0
- package/src/local-inference-routes.test.ts +344 -0
- package/src/local-inference-routes.ts +1543 -0
- package/src/provider.d.ts +21 -0
- package/src/provider.d.ts.map +1 -0
- package/src/provider.ts +1082 -0
- package/src/routes/compat-helpers.d.ts +18 -0
- package/src/routes/compat-helpers.d.ts.map +1 -0
- package/src/routes/compat-helpers.ts +274 -0
- package/src/routes/family-member-route.d.ts +62 -0
- package/src/routes/family-member-route.d.ts.map +1 -0
- package/src/routes/family-member-route.ts +353 -0
- package/src/routes/index.d.ts +19 -0
- package/src/routes/index.d.ts.map +1 -0
- package/src/routes/index.ts +60 -0
- package/src/routes/live-diarization-route.d.ts +26 -0
- package/src/routes/live-diarization-route.d.ts.map +1 -0
- package/src/routes/live-diarization-route.test.ts +213 -0
- package/src/routes/live-diarization-route.ts +122 -0
- package/src/routes/local-inference-asr-route.d.ts +4 -0
- package/src/routes/local-inference-asr-route.d.ts.map +1 -0
- package/src/routes/local-inference-asr-route.test.ts +205 -0
- package/src/routes/local-inference-asr-route.ts +163 -0
- package/src/routes/local-inference-asr-transcribe.d.ts +20 -0
- package/src/routes/local-inference-asr-transcribe.d.ts.map +1 -0
- package/src/routes/local-inference-asr-transcribe.test.ts +118 -0
- package/src/routes/local-inference-asr-transcribe.ts +97 -0
- package/src/routes/local-inference-compat-routes.d.ts +16 -0
- package/src/routes/local-inference-compat-routes.d.ts.map +1 -0
- package/src/routes/local-inference-compat-routes.test.ts +485 -0
- package/src/routes/local-inference-compat-routes.ts +808 -0
- package/src/routes/local-inference-tts-route.d.ts +7 -0
- package/src/routes/local-inference-tts-route.d.ts.map +1 -0
- package/src/routes/local-inference-tts-route.test.ts +179 -0
- package/src/routes/local-inference-tts-route.ts +230 -0
- package/src/routes/transcript-audio-store.d.ts +15 -0
- package/src/routes/transcript-audio-store.d.ts.map +1 -0
- package/src/routes/transcript-audio-store.ts +27 -0
- package/src/routes/transcripts-routes.d.ts +36 -0
- package/src/routes/transcripts-routes.d.ts.map +1 -0
- package/src/routes/transcripts-routes.test.ts +144 -0
- package/src/routes/transcripts-routes.ts +159 -0
- package/src/routes/voice-first-run-routes.d.ts +62 -0
- package/src/routes/voice-first-run-routes.d.ts.map +1 -0
- package/src/routes/voice-first-run-routes.ts +524 -0
- package/src/routes/voice-models-routes.d.ts +62 -0
- package/src/routes/voice-models-routes.d.ts.map +1 -0
- package/src/routes/voice-models-routes.ts +554 -0
- package/src/routes/voice-profile-plugin-routes.d.ts +19 -0
- package/src/routes/voice-profile-plugin-routes.d.ts.map +1 -0
- package/src/routes/voice-profile-plugin-routes.ts +138 -0
- package/src/routes/voice-profiles-management-routes.d.ts +52 -0
- package/src/routes/voice-profiles-management-routes.d.ts.map +1 -0
- package/src/routes/voice-profiles-management-routes.ts +476 -0
- package/src/routes/voice-speaker-profile-routes.d.ts +57 -0
- package/src/routes/voice-speaker-profile-routes.d.ts.map +1 -0
- package/src/routes/voice-speaker-profile-routes.ts +199 -0
- package/src/runtime/aosp-llama-loader-selection.test.ts +80 -0
- package/src/runtime/capacitor-llama.d.ts +25 -0
- package/src/runtime/embedding-manager-support.d.ts +77 -0
- package/src/runtime/embedding-manager-support.d.ts.map +1 -0
- package/src/runtime/embedding-manager-support.ts +497 -0
- package/src/runtime/embedding-presets.d.ts +16 -0
- package/src/runtime/embedding-presets.d.ts.map +1 -0
- package/src/runtime/embedding-presets.ts +81 -0
- package/src/runtime/embedding-warmup-policy.d.ts +14 -0
- package/src/runtime/embedding-warmup-policy.d.ts.map +1 -0
- package/src/runtime/embedding-warmup-policy.test.ts +53 -0
- package/src/runtime/embedding-warmup-policy.ts +48 -0
- package/src/runtime/ensure-local-inference-handler.d.ts +62 -0
- package/src/runtime/ensure-local-inference-handler.d.ts.map +1 -0
- package/src/runtime/ensure-local-inference-handler.test.ts +528 -0
- package/src/runtime/ensure-local-inference-handler.ts +1448 -0
- package/src/runtime/index.d.ts +15 -0
- package/src/runtime/index.d.ts.map +1 -0
- package/src/runtime/index.ts +33 -0
- package/src/runtime/mobile-local-inference-gate.d.ts +31 -0
- package/src/runtime/mobile-local-inference-gate.d.ts.map +1 -0
- package/src/runtime/mobile-local-inference-gate.test.ts +69 -0
- package/src/runtime/mobile-local-inference-gate.ts +44 -0
- package/src/runtime/voice-entity-binding.d.ts +103 -0
- package/src/runtime/voice-entity-binding.d.ts.map +1 -0
- package/src/runtime/voice-entity-binding.transcript.test.ts +69 -0
- package/src/runtime/voice-entity-binding.ts +328 -0
- package/src/services/README.md +71 -0
- package/src/services/__tests__/backend-selector.test.ts +101 -0
- package/src/services/__tests__/checkpoint-manager.test.ts +376 -0
- package/src/services/__tests__/gpu-autotune.test.ts +400 -0
- package/src/services/__tests__/llm-streaming-binding.test.ts +85 -0
- package/src/services/__tests__/planner-grammar.test.ts +372 -0
- package/src/services/__tests__/runtime-target.test.ts +176 -0
- package/src/services/active-model-switch-rollback.test.ts +183 -0
- package/src/services/active-model.d.ts +282 -0
- package/src/services/active-model.d.ts.map +1 -0
- package/src/services/active-model.ts +1213 -0
- package/src/services/assignments.d.ts +71 -0
- package/src/services/assignments.d.ts.map +1 -0
- package/src/services/assignments.test.ts +80 -0
- package/src/services/assignments.ts +230 -0
- package/src/services/backend-selector.ts +95 -0
- package/src/services/backend.d.ts +346 -0
- package/src/services/backend.d.ts.map +1 -0
- package/src/services/backend.ts +612 -0
- package/src/services/bionic-host-loader.d.ts +46 -0
- package/src/services/bionic-host-loader.d.ts.map +1 -0
- package/src/services/bionic-host-loader.test.ts +133 -0
- package/src/services/bionic-host-loader.ts +180 -0
- package/src/services/bundled-models.d.ts +34 -0
- package/src/services/bundled-models.d.ts.map +1 -0
- package/src/services/bundled-models.ts +129 -0
- package/src/services/cache-bridge.d.ts +206 -0
- package/src/services/cache-bridge.d.ts.map +1 -0
- package/src/services/cache-bridge.test.ts +516 -0
- package/src/services/cache-bridge.ts +423 -0
- package/src/services/catalog.d.ts +10 -0
- package/src/services/catalog.d.ts.map +1 -0
- package/src/services/catalog.test.ts +238 -0
- package/src/services/catalog.ts +27 -0
- package/src/services/checkpoint-client.d.ts +109 -0
- package/src/services/checkpoint-client.d.ts.map +1 -0
- package/src/services/checkpoint-client.ts +258 -0
- package/src/services/checkpoint-manager.ts +474 -0
- package/src/services/cloud-fallback.d.ts +102 -0
- package/src/services/cloud-fallback.d.ts.map +1 -0
- package/src/services/cloud-fallback.ts +230 -0
- package/src/services/conversation-registry.d.ts +142 -0
- package/src/services/conversation-registry.d.ts.map +1 -0
- package/src/services/conversation-registry.test.ts +235 -0
- package/src/services/conversation-registry.ts +264 -0
- package/src/services/desktop-fused-ffi-backend-runtime.d.ts +95 -0
- package/src/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
- package/src/services/desktop-fused-ffi-backend-runtime.ts +339 -0
- package/src/services/device-bridge.d.ts +188 -0
- package/src/services/device-bridge.d.ts.map +1 -0
- package/src/services/device-bridge.ts +1237 -0
- package/src/services/device-resource-metrics.d.ts +149 -0
- package/src/services/device-resource-metrics.d.ts.map +1 -0
- package/src/services/device-resource-metrics.test.ts +98 -0
- package/src/services/device-resource-metrics.ts +346 -0
- package/src/services/device-tier.d.ts +115 -0
- package/src/services/device-tier.d.ts.map +1 -0
- package/src/services/device-tier.test.ts +371 -0
- package/src/services/device-tier.ts +410 -0
- package/src/services/downloader.d.ts +82 -0
- package/src/services/downloader.d.ts.map +1 -0
- package/src/services/downloader.test.ts +747 -0
- package/src/services/downloader.ts +925 -0
- package/src/services/engine-direct-bundle.test.ts +58 -0
- package/src/services/engine-streaming.test.ts +80 -0
- package/src/services/engine.d.ts +540 -0
- package/src/services/engine.d.ts.map +1 -0
- package/src/services/engine.ts +1909 -0
- package/src/services/ensure-local-artifacts.integration.test.ts +273 -0
- package/src/services/ensure-local-artifacts.test.ts +368 -0
- package/src/services/ensure-local-artifacts.ts +351 -0
- package/src/services/external-scanner.d.ts +17 -0
- package/src/services/external-scanner.d.ts.map +1 -0
- package/src/services/external-scanner.ts +312 -0
- package/src/services/ffi-llm-mock.ts +354 -0
- package/src/services/ffi-llm-streaming-abi.ts +442 -0
- package/src/services/ffi-streaming-backend.d.ts +180 -0
- package/src/services/ffi-streaming-backend.d.ts.map +1 -0
- package/src/services/ffi-streaming-backend.ts +382 -0
- package/src/services/ffi-streaming-runner.d.ts +122 -0
- package/src/services/ffi-streaming-runner.d.ts.map +1 -0
- package/src/services/ffi-streaming-runner.test.ts +60 -0
- package/src/services/ffi-streaming-runner.ts +354 -0
- package/src/services/ffi-unload-ordering.test.ts +162 -0
- package/src/services/gpu-autotune.ts +534 -0
- package/src/services/gpu-detect.d.ts +56 -0
- package/src/services/gpu-detect.d.ts.map +1 -0
- package/src/services/gpu-detect.ts +139 -0
- package/src/services/handler-registry.d.ts +72 -0
- package/src/services/handler-registry.d.ts.map +1 -0
- package/src/services/handler-registry.ts +240 -0
- package/src/services/hardware.d.ts +63 -0
- package/src/services/hardware.d.ts.map +1 -0
- package/src/services/hardware.test.ts +231 -0
- package/src/services/hardware.ts +410 -0
- package/src/services/hf-search.d.ts +26 -0
- package/src/services/hf-search.d.ts.map +1 -0
- package/src/services/hf-search.test.ts +69 -0
- package/src/services/hf-search.ts +420 -0
- package/src/services/image-description-runtime.d.ts +14 -0
- package/src/services/image-description-runtime.d.ts.map +1 -0
- package/src/services/image-description-runtime.test.ts +61 -0
- package/src/services/image-description-runtime.ts +118 -0
- package/src/services/imagegen/aosp-unavailable.d.ts +134 -0
- package/src/services/imagegen/aosp-unavailable.d.ts.map +1 -0
- package/src/services/imagegen/aosp-unavailable.ts +229 -0
- package/src/services/imagegen/backend-selector.d.ts +118 -0
- package/src/services/imagegen/backend-selector.d.ts.map +1 -0
- package/src/services/imagegen/backend-selector.ts +277 -0
- package/src/services/imagegen/coreml-unavailable.d.ts +105 -0
- package/src/services/imagegen/coreml-unavailable.d.ts.map +1 -0
- package/src/services/imagegen/coreml-unavailable.ts +237 -0
- package/src/services/imagegen/errors.d.ts +16 -0
- package/src/services/imagegen/errors.d.ts.map +1 -0
- package/src/services/imagegen/errors.ts +40 -0
- package/src/services/imagegen/index.d.ts +58 -0
- package/src/services/imagegen/index.d.ts.map +1 -0
- package/src/services/imagegen/index.ts +144 -0
- package/src/services/imagegen/mflux.d.ts +74 -0
- package/src/services/imagegen/mflux.d.ts.map +1 -0
- package/src/services/imagegen/mflux.ts +313 -0
- package/src/services/imagegen/sd-cpp.d.ts +180 -0
- package/src/services/imagegen/sd-cpp.d.ts.map +1 -0
- package/src/services/imagegen/sd-cpp.ts +718 -0
- package/src/services/imagegen/tensorrt-unavailable.d.ts +83 -0
- package/src/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
- package/src/services/imagegen/tensorrt-unavailable.ts +295 -0
- package/src/services/imagegen/types.d.ts +181 -0
- package/src/services/imagegen/types.d.ts.map +1 -0
- package/src/services/imagegen/types.ts +193 -0
- package/src/services/index.d.ts +29 -0
- package/src/services/index.d.ts.map +1 -0
- package/src/services/index.ts +211 -0
- package/src/services/inference-capabilities.d.ts +132 -0
- package/src/services/inference-capabilities.d.ts.map +1 -0
- package/src/services/inference-capabilities.test.ts +75 -0
- package/src/services/inference-capabilities.ts +204 -0
- package/src/services/inference-telemetry.d.ts +59 -0
- package/src/services/inference-telemetry.d.ts.map +1 -0
- package/src/services/inference-telemetry.ts +143 -0
- package/src/services/ios-llama-streaming.ts +248 -0
- package/src/services/kv-spill.d.ts +189 -0
- package/src/services/kv-spill.d.ts.map +1 -0
- package/src/services/kv-spill.test.ts +222 -0
- package/src/services/kv-spill.ts +356 -0
- package/src/services/latency-trace.d.ts +346 -0
- package/src/services/latency-trace.d.ts.map +1 -0
- package/src/services/latency-trace.test.ts +266 -0
- package/src/services/latency-trace.ts +844 -0
- package/src/services/llama-server-metrics.ts +304 -0
- package/src/services/llm-streaming-binding.d.ts +96 -0
- package/src/services/llm-streaming-binding.d.ts.map +1 -0
- package/src/services/llm-streaming-binding.ts +136 -0
- package/src/services/load-args.d.ts +82 -0
- package/src/services/load-args.d.ts.map +1 -0
- package/src/services/load-args.ts +81 -0
- package/src/services/manifest/eliza-1.manifest.v1.json +708 -0
- package/src/services/manifest/index.d.ts +4 -0
- package/src/services/manifest/index.d.ts.map +1 -0
- package/src/services/manifest/index.ts +66 -0
- package/src/services/manifest/manifest.test.ts +689 -0
- package/src/services/manifest/schema.d.ts +713 -0
- package/src/services/manifest/schema.d.ts.map +1 -0
- package/src/services/manifest/schema.ts +653 -0
- package/src/services/manifest/types.d.ts +30 -0
- package/src/services/manifest/types.d.ts.map +1 -0
- package/src/services/manifest/types.ts +55 -0
- package/src/services/manifest/validator.d.ts +66 -0
- package/src/services/manifest/validator.d.ts.map +1 -0
- package/src/services/manifest/validator.ts +567 -0
- package/src/services/memory-arbiter.d.ts +318 -0
- package/src/services/memory-arbiter.d.ts.map +1 -0
- package/src/services/memory-arbiter.test.ts +419 -0
- package/src/services/memory-arbiter.ts +925 -0
- package/src/services/memory-monitor.d.ts +122 -0
- package/src/services/memory-monitor.d.ts.map +1 -0
- package/src/services/memory-monitor.test.ts +208 -0
- package/src/services/memory-monitor.ts +297 -0
- package/src/services/memory-pressure.d.ts +130 -0
- package/src/services/memory-pressure.d.ts.map +1 -0
- package/src/services/memory-pressure.ts +414 -0
- package/src/services/mtp-doctor.d.ts +13 -0
- package/src/services/mtp-doctor.d.ts.map +1 -0
- package/src/services/mtp-doctor.ts +78 -0
- package/src/services/network-policy.d.ts +127 -0
- package/src/services/network-policy.d.ts.map +1 -0
- package/src/services/network-policy.ts +346 -0
- package/src/services/paths.d.ts +6 -0
- package/src/services/paths.d.ts.map +1 -0
- package/src/services/paths.ts +25 -0
- package/src/services/planner-skeleton.d.ts +124 -0
- package/src/services/planner-skeleton.d.ts.map +1 -0
- package/src/services/planner-skeleton.ts +175 -0
- package/src/services/providers.d.ts +38 -0
- package/src/services/providers.d.ts.map +1 -0
- package/src/services/providers.ts +507 -0
- package/src/services/ram-budget-cache.test.ts +163 -0
- package/src/services/ram-budget.d.ts +110 -0
- package/src/services/ram-budget.d.ts.map +1 -0
- package/src/services/ram-budget.ts +0 -0
- package/src/services/readiness.d.ts +9 -0
- package/src/services/readiness.d.ts.map +1 -0
- package/src/services/readiness.test.ts +87 -0
- package/src/services/readiness.ts +238 -0
- package/src/services/recommendation.d.ts +111 -0
- package/src/services/recommendation.d.ts.map +1 -0
- package/src/services/recommendation.ts +671 -0
- package/src/services/registry.d.ts +35 -0
- package/src/services/registry.d.ts.map +1 -0
- package/src/services/registry.ts +151 -0
- package/src/services/router-handler.d.ts +92 -0
- package/src/services/router-handler.d.ts.map +1 -0
- package/src/services/router-handler.test.ts +45 -0
- package/src/services/router-handler.ts +407 -0
- package/src/services/routing-policy.d.ts +69 -0
- package/src/services/routing-policy.d.ts.map +1 -0
- package/src/services/routing-policy.test.ts +164 -0
- package/src/services/routing-policy.ts +297 -0
- package/src/services/routing-preferences.d.ts +8 -0
- package/src/services/routing-preferences.d.ts.map +1 -0
- package/src/services/routing-preferences.ts +17 -0
- package/src/services/runtime-target.d.ts +98 -0
- package/src/services/runtime-target.d.ts.map +1 -0
- package/src/services/runtime-target.ts +154 -0
- package/src/services/service.d.ts +128 -0
- package/src/services/service.d.ts.map +1 -0
- package/src/services/service.test.ts +223 -0
- package/src/services/service.ts +735 -0
- package/src/services/session-pool.d.ts +72 -0
- package/src/services/session-pool.d.ts.map +1 -0
- package/src/services/session-pool.ts +153 -0
- package/src/services/structured-output/deterministic-repair.d.ts +23 -0
- package/src/services/structured-output/deterministic-repair.d.ts.map +1 -0
- package/src/services/structured-output/deterministic-repair.test.ts +169 -0
- package/src/services/structured-output/deterministic-repair.ts +443 -0
- package/src/services/structured-output/index.ts +4 -0
- package/src/services/structured-output.d.ts +311 -0
- package/src/services/structured-output.d.ts.map +1 -0
- package/src/services/structured-output.test.ts +483 -0
- package/src/services/structured-output.ts +712 -0
- package/src/services/system-memory.d.ts +33 -0
- package/src/services/system-memory.d.ts.map +1 -0
- package/src/services/system-memory.test.ts +47 -0
- package/src/services/system-memory.ts +67 -0
- package/src/services/transcription-priority.test.ts +211 -0
- package/src/services/types.d.ts +19 -0
- package/src/services/types.d.ts.map +1 -0
- package/src/services/types.ts +55 -0
- package/src/services/verify-on-device.d.ts +34 -0
- package/src/services/verify-on-device.d.ts.map +1 -0
- package/src/services/verify-on-device.test.ts +87 -0
- package/src/services/verify-on-device.ts +127 -0
- package/src/services/verify.d.ts +8 -0
- package/src/services/verify.d.ts.map +1 -0
- package/src/services/verify.ts +13 -0
- package/src/services/vision/aosp-unavailable.d.ts +115 -0
- package/src/services/vision/aosp-unavailable.d.ts.map +1 -0
- package/src/services/vision/aosp-unavailable.ts +163 -0
- package/src/services/vision/capacitor-llama.d.ts +99 -0
- package/src/services/vision/capacitor-llama.d.ts.map +1 -0
- package/src/services/vision/capacitor-llama.ts +255 -0
- package/src/services/vision/cloud-fallback.d.ts +47 -0
- package/src/services/vision/cloud-fallback.d.ts.map +1 -0
- package/src/services/vision/cloud-fallback.test.ts +243 -0
- package/src/services/vision/cloud-fallback.ts +268 -0
- package/src/services/vision/fallback-chain.test.ts +86 -0
- package/src/services/vision/hash.d.ts +71 -0
- package/src/services/vision/hash.d.ts.map +1 -0
- package/src/services/vision/hash.ts +157 -0
- package/src/services/vision/index.d.ts +95 -0
- package/src/services/vision/index.d.ts.map +1 -0
- package/src/services/vision/index.ts +251 -0
- package/src/services/vision/llama-server.d.ts +73 -0
- package/src/services/vision/llama-server.d.ts.map +1 -0
- package/src/services/vision/llama-server.ts +177 -0
- package/src/services/vision/types.d.ts +153 -0
- package/src/services/vision/types.d.ts.map +1 -0
- package/src/services/vision/types.ts +154 -0
- package/src/services/vision/vast-fallback.d.ts +18 -0
- package/src/services/vision/vast-fallback.d.ts.map +1 -0
- package/src/services/vision/vast-fallback.ts +127 -0
- package/src/services/vision-embedding-cache.d.ts +98 -0
- package/src/services/vision-embedding-cache.d.ts.map +1 -0
- package/src/services/vision-embedding-cache.ts +189 -0
- package/src/services/voice/VOICE_WORKBENCH.md +88 -0
- package/src/services/voice/__test-helpers__/fake-ffi.ts +94 -0
- package/src/services/voice/__test-helpers__/synthetic-speech.ts +124 -0
- package/src/services/voice/__tests__/checkpoint-manager.test.ts +241 -0
- package/src/services/voice/__tests__/checkpoint-policy.test.ts +270 -0
- package/src/services/voice/__tests__/eager-context-builder.test.ts +257 -0
- package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +288 -0
- package/src/services/voice/__tests__/eot-classifier.test.ts +431 -0
- package/src/services/voice/__tests__/optimistic-rollback.test.ts +312 -0
- package/src/services/voice/__tests__/prefill-client.test.ts +266 -0
- package/src/services/voice/__tests__/prefix-preserving-queue.test.ts +208 -0
- package/src/services/voice/__tests__/streaming-asr.test.ts +450 -0
- package/src/services/voice/__tests__/streaming-transcriber.test.ts +339 -0
- package/src/services/voice/__tests__/turn-detector-resolver.test.ts +195 -0
- package/src/services/voice/__tests__/voice-state-machine-prefill.test.ts +275 -0
- package/src/services/voice/__tests__/voice-state-machine.test.ts +354 -0
- package/src/services/voice/asr-timed.real.test.ts +141 -0
- package/src/services/voice/audio-frame-consumer.d.ts +212 -0
- package/src/services/voice/audio-frame-consumer.d.ts.map +1 -0
- package/src/services/voice/audio-frame-consumer.test.ts +343 -0
- package/src/services/voice/audio-frame-consumer.ts +491 -0
- package/src/services/voice/barge-in.d.ts +112 -0
- package/src/services/voice/barge-in.d.ts.map +1 -0
- package/src/services/voice/barge-in.test.ts +244 -0
- package/src/services/voice/barge-in.ts +336 -0
- package/src/services/voice/cancellation-coordinator.d.ts +127 -0
- package/src/services/voice/cancellation-coordinator.d.ts.map +1 -0
- package/src/services/voice/cancellation-coordinator.test.ts +196 -0
- package/src/services/voice/cancellation-coordinator.ts +269 -0
- package/src/services/voice/checkpoint-manager.d.ts +199 -0
- package/src/services/voice/checkpoint-manager.d.ts.map +1 -0
- package/src/services/voice/checkpoint-manager.ts +401 -0
- package/src/services/voice/checkpoint-policy.ts +336 -0
- package/src/services/voice/composite-eot-classifier.test.ts +59 -0
- package/src/services/voice/e2e-harness.test.ts +182 -0
- package/src/services/voice/e2e-harness.ts +743 -0
- package/src/services/voice/eager-context-builder.d.ts +170 -0
- package/src/services/voice/eager-context-builder.d.ts.map +1 -0
- package/src/services/voice/eager-context-builder.ts +262 -0
- package/src/services/voice/eliza1-eot-scorer.d.ts +124 -0
- package/src/services/voice/eliza1-eot-scorer.d.ts.map +1 -0
- package/src/services/voice/eliza1-eot-scorer.ts +242 -0
- package/src/services/voice/embedding-server.ts +200 -0
- package/src/services/voice/embedding.d.ts +133 -0
- package/src/services/voice/embedding.d.ts.map +1 -0
- package/src/services/voice/embedding.test.ts +131 -0
- package/src/services/voice/embedding.ts +243 -0
- package/src/services/voice/emotion-attribution.d.ts +68 -0
- package/src/services/voice/emotion-attribution.d.ts.map +1 -0
- package/src/services/voice/emotion-attribution.test.ts +129 -0
- package/src/services/voice/emotion-attribution.ts +361 -0
- package/src/services/voice/engine-bridge-cancellation.test.ts +422 -0
- package/src/services/voice/engine-bridge.d.ts +759 -0
- package/src/services/voice/engine-bridge.d.ts.map +1 -0
- package/src/services/voice/engine-bridge.test.ts +384 -0
- package/src/services/voice/engine-bridge.ts +2302 -0
- package/src/services/voice/eot-classifier-ggml.d.ts +179 -0
- package/src/services/voice/eot-classifier-ggml.d.ts.map +1 -0
- package/src/services/voice/eot-classifier-ggml.ts +566 -0
- package/src/services/voice/eot-classifier.d.ts +214 -0
- package/src/services/voice/eot-classifier.d.ts.map +1 -0
- package/src/services/voice/eot-classifier.ts +533 -0
- package/src/services/voice/errors.d.ts +20 -0
- package/src/services/voice/errors.d.ts.map +1 -0
- package/src/services/voice/errors.ts +32 -0
- package/src/services/voice/expressive-tags.d.ts +158 -0
- package/src/services/voice/expressive-tags.d.ts.map +1 -0
- package/src/services/voice/expressive-tags.ts +405 -0
- package/src/services/voice/ffi-bindings.d.ts +674 -0
- package/src/services/voice/ffi-bindings.d.ts.map +1 -0
- package/src/services/voice/ffi-bindings.test.ts +728 -0
- package/src/services/voice/ffi-bindings.ts +3225 -0
- package/src/services/voice/first-line-cache.d.ts +181 -0
- package/src/services/voice/first-line-cache.d.ts.map +1 -0
- package/src/services/voice/first-line-cache.ts +725 -0
- package/src/services/voice/fused-eot-scorer.d.ts +51 -0
- package/src/services/voice/fused-eot-scorer.d.ts.map +1 -0
- package/src/services/voice/fused-eot-scorer.ts +135 -0
- package/src/services/voice/index.d.ts +91 -0
- package/src/services/voice/index.d.ts.map +1 -0
- package/src/services/voice/index.ts +481 -0
- package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +151 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +151 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.test.ts +60 -0
- package/src/services/voice/kokoro/__tests__/kokoro-engine-discovery.test.ts +277 -0
- package/src/services/voice/kokoro/__tests__/kokoro-ffi-runtime.test.ts +235 -0
- package/src/services/voice/kokoro/__tests__/kokoro-runtime.test.ts +95 -0
- package/src/services/voice/kokoro/__tests__/phonemizer.test.ts +53 -0
- package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +231 -0
- package/src/services/voice/kokoro/__tests__/voices.test.ts +57 -0
- package/src/services/voice/kokoro/index.ts +79 -0
- package/src/services/voice/kokoro/kokoro-backend.d.ts +72 -0
- package/src/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-backend.ts +207 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts +58 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-engine-discovery.ts +177 -0
- package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts +75 -0
- package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +233 -0
- package/src/services/voice/kokoro/kokoro-runtime.d.ts +100 -0
- package/src/services/voice/kokoro/kokoro-runtime.d.ts.map +1 -0
- package/src/services/voice/kokoro/kokoro-runtime.ts +170 -0
- package/src/services/voice/kokoro/phoneme-stream.ts +123 -0
- package/src/services/voice/kokoro/phonemizer.d.ts +50 -0
- package/src/services/voice/kokoro/phonemizer.d.ts.map +1 -0
- package/src/services/voice/kokoro/phonemizer.ts +344 -0
- package/src/services/voice/kokoro/pick-runtime.d.ts +61 -0
- package/src/services/voice/kokoro/pick-runtime.d.ts.map +1 -0
- package/src/services/voice/kokoro/pick-runtime.test.ts +91 -0
- package/src/services/voice/kokoro/pick-runtime.ts +130 -0
- package/src/services/voice/kokoro/runtime-selection.d.ts +92 -0
- package/src/services/voice/kokoro/runtime-selection.d.ts.map +1 -0
- package/src/services/voice/kokoro/runtime-selection.ts +237 -0
- package/src/services/voice/kokoro/types.d.ts +82 -0
- package/src/services/voice/kokoro/types.d.ts.map +1 -0
- package/src/services/voice/kokoro/types.ts +95 -0
- package/src/services/voice/kokoro/voice-presets.d.ts +23 -0
- package/src/services/voice/kokoro/voice-presets.d.ts.map +1 -0
- package/src/services/voice/kokoro/voice-presets.ts +129 -0
- package/src/services/voice/kokoro/voices.d.ts +30 -0
- package/src/services/voice/kokoro/voices.d.ts.map +1 -0
- package/src/services/voice/kokoro/voices.ts +64 -0
- package/src/services/voice/lifecycle.d.ts +135 -0
- package/src/services/voice/lifecycle.d.ts.map +1 -0
- package/src/services/voice/lifecycle.test.ts +315 -0
- package/src/services/voice/lifecycle.ts +301 -0
- package/src/services/voice/live-diarization-session.d.ts +96 -0
- package/src/services/voice/live-diarization-session.d.ts.map +1 -0
- package/src/services/voice/live-diarization-session.ts +289 -0
- package/src/services/voice/mic-source.d.ts +136 -0
- package/src/services/voice/mic-source.d.ts.map +1 -0
- package/src/services/voice/mic-source.test.ts +210 -0
- package/src/services/voice/mic-source.ts +503 -0
- package/src/services/voice/optimistic-policy.d.ts +109 -0
- package/src/services/voice/optimistic-policy.d.ts.map +1 -0
- package/src/services/voice/optimistic-policy.test.ts +101 -0
- package/src/services/voice/optimistic-policy.ts +192 -0
- package/src/services/voice/optimistic-rollback.ts +343 -0
- package/src/services/voice/partial-stabilizer.d.ts +73 -0
- package/src/services/voice/partial-stabilizer.d.ts.map +1 -0
- package/src/services/voice/partial-stabilizer.test.ts +68 -0
- package/src/services/voice/partial-stabilizer.ts +140 -0
- package/src/services/voice/phoneme-tokenizer.d.ts +49 -0
- package/src/services/voice/phoneme-tokenizer.d.ts.map +1 -0
- package/src/services/voice/phoneme-tokenizer.ts +158 -0
- package/src/services/voice/phrase-cache.d.ts +76 -0
- package/src/services/voice/phrase-cache.d.ts.map +1 -0
- package/src/services/voice/phrase-cache.test.ts +242 -0
- package/src/services/voice/phrase-cache.ts +186 -0
- package/src/services/voice/phrase-chunker.d.ts +62 -0
- package/src/services/voice/phrase-chunker.d.ts.map +1 -0
- package/src/services/voice/phrase-chunker.test.ts +239 -0
- package/src/services/voice/phrase-chunker.ts +281 -0
- package/src/services/voice/pipeline-impls.d.ts +151 -0
- package/src/services/voice/pipeline-impls.d.ts.map +1 -0
- package/src/services/voice/pipeline-impls.l6.test.ts +110 -0
- package/src/services/voice/pipeline-impls.test.ts +292 -0
- package/src/services/voice/pipeline-impls.ts +315 -0
- package/src/services/voice/pipeline.d.ts +216 -0
- package/src/services/voice/pipeline.d.ts.map +1 -0
- package/src/services/voice/pipeline.ts +505 -0
- package/src/services/voice/prefill-client.d.ts +123 -0
- package/src/services/voice/prefill-client.d.ts.map +1 -0
- package/src/services/voice/prefill-client.ts +316 -0
- package/src/services/voice/prefix-preserving-queue.d.ts +113 -0
- package/src/services/voice/prefix-preserving-queue.d.ts.map +1 -0
- package/src/services/voice/prefix-preserving-queue.ts +162 -0
- package/src/services/voice/profile-store.d.ts +248 -0
- package/src/services/voice/profile-store.d.ts.map +1 -0
- package/src/services/voice/profile-store.ts +887 -0
- package/src/services/voice/real-audio-decode.test.ts +148 -0
- package/src/services/voice/ring-buffer.d.ts +40 -0
- package/src/services/voice/ring-buffer.d.ts.map +1 -0
- package/src/services/voice/ring-buffer.test.ts +129 -0
- package/src/services/voice/ring-buffer.ts +123 -0
- package/src/services/voice/rollback-queue.d.ts +24 -0
- package/src/services/voice/rollback-queue.d.ts.map +1 -0
- package/src/services/voice/rollback-queue.ts +74 -0
- package/src/services/voice/samantha-preset-placeholder.d.ts +67 -0
- package/src/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
- package/src/services/voice/samantha-preset-placeholder.test.ts +97 -0
- package/src/services/voice/samantha-preset-placeholder.ts +148 -0
- package/src/services/voice/samantha-preset-regenerator.d.ts +87 -0
- package/src/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
- package/src/services/voice/samantha-preset-regenerator.ts +393 -0
- package/src/services/voice/scheduler.d.ts +146 -0
- package/src/services/voice/scheduler.d.ts.map +1 -0
- package/src/services/voice/scheduler.t2.test.ts +141 -0
- package/src/services/voice/scheduler.ts +927 -0
- package/src/services/voice/shared-resources.d.ts +190 -0
- package/src/services/voice/shared-resources.d.ts.map +1 -0
- package/src/services/voice/shared-resources.ts +320 -0
- package/src/services/voice/speaker/attribution-pipeline.d.ts +74 -0
- package/src/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
- package/src/services/voice/speaker/attribution-pipeline.ts +386 -0
- package/src/services/voice/speaker/diarizer-fused.d.ts +59 -0
- package/src/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
- package/src/services/voice/speaker/diarizer-fused.real.test.ts +100 -0
- package/src/services/voice/speaker/diarizer-fused.ts +154 -0
- package/src/services/voice/speaker/diarizer.d.ts +75 -0
- package/src/services/voice/speaker/diarizer.d.ts.map +1 -0
- package/src/services/voice/speaker/diarizer.ts +218 -0
- package/src/services/voice/speaker/encoder-fused.d.ts +60 -0
- package/src/services/voice/speaker/encoder-fused.d.ts.map +1 -0
- package/src/services/voice/speaker/encoder-fused.real.test.ts +113 -0
- package/src/services/voice/speaker/encoder-fused.ts +138 -0
- package/src/services/voice/speaker/encoder-ggml.d.ts +33 -0
- package/src/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
- package/src/services/voice/speaker/encoder-ggml.ts +79 -0
- package/src/services/voice/speaker/encoder.d.ts +37 -0
- package/src/services/voice/speaker/encoder.d.ts.map +1 -0
- package/src/services/voice/speaker/encoder.ts +105 -0
- package/src/services/voice/speaker-imprint.d.ts +83 -0
- package/src/services/voice/speaker-imprint.d.ts.map +1 -0
- package/src/services/voice/speaker-imprint.test.ts +185 -0
- package/src/services/voice/speaker-imprint.ts +312 -0
- package/src/services/voice/speaker-preset-cache.d.ts +77 -0
- package/src/services/voice/speaker-preset-cache.d.ts.map +1 -0
- package/src/services/voice/speaker-preset-cache.test.ts +154 -0
- package/src/services/voice/speaker-preset-cache.ts +195 -0
- package/src/services/voice/streaming-asr/streaming-pipeline-adapter.ts +292 -0
- package/src/services/voice/system-audio-sink.d.ts +73 -0
- package/src/services/voice/system-audio-sink.d.ts.map +1 -0
- package/src/services/voice/system-audio-sink.test.ts +29 -0
- package/src/services/voice/system-audio-sink.ts +366 -0
- package/src/services/voice/transcriber.d.ts +244 -0
- package/src/services/voice/transcriber.d.ts.map +1 -0
- package/src/services/voice/transcriber.test.ts +392 -0
- package/src/services/voice/transcriber.ts +704 -0
- package/src/services/voice/transcript-knowledge.d.ts +37 -0
- package/src/services/voice/transcript-knowledge.d.ts.map +1 -0
- package/src/services/voice/transcript-knowledge.test.ts +68 -0
- package/src/services/voice/transcript-knowledge.ts +75 -0
- package/src/services/voice/transcript-service.d.ts +41 -0
- package/src/services/voice/transcript-service.d.ts.map +1 -0
- package/src/services/voice/transcript-service.test.ts +137 -0
- package/src/services/voice/transcript-service.ts +141 -0
- package/src/services/voice/transcript-store.d.ts +53 -0
- package/src/services/voice/transcript-store.d.ts.map +1 -0
- package/src/services/voice/transcript-store.test.ts +153 -0
- package/src/services/voice/transcript-store.ts +132 -0
- package/src/services/voice/turn-controller.d.ts +183 -0
- package/src/services/voice/turn-controller.d.ts.map +1 -0
- package/src/services/voice/turn-controller.test.ts +575 -0
- package/src/services/voice/turn-controller.ts +596 -0
- package/src/services/voice/types.d.ts +643 -0
- package/src/services/voice/types.d.ts.map +1 -0
- package/src/services/voice/types.ts +699 -0
- package/src/services/voice/vad.d.ts +282 -0
- package/src/services/voice/vad.d.ts.map +1 -0
- package/src/services/voice/vad.test.ts +480 -0
- package/src/services/voice/vad.ts +827 -0
- package/src/services/voice/vad.v1-v4.test.ts +222 -0
- package/src/services/voice/voice-budget.d.ts +241 -0
- package/src/services/voice/voice-budget.d.ts.map +1 -0
- package/src/services/voice/voice-budget.test.ts +418 -0
- package/src/services/voice/voice-budget.ts +635 -0
- package/src/services/voice/voice-duet.test.ts +375 -0
- package/src/services/voice/voice-emotion-classifier.d.ts +95 -0
- package/src/services/voice/voice-emotion-classifier.d.ts.map +1 -0
- package/src/services/voice/voice-emotion-classifier.test.ts +210 -0
- package/src/services/voice/voice-emotion-classifier.ts +273 -0
- package/src/services/voice/voice-preset-format.d.ts +158 -0
- package/src/services/voice/voice-preset-format.d.ts.map +1 -0
- package/src/services/voice/voice-preset-format.ts +700 -0
- package/src/services/voice/voice-preset-generator.test.ts +89 -0
- package/src/services/voice/voice-profile-artifact.d.ts +116 -0
- package/src/services/voice/voice-profile-artifact.d.ts.map +1 -0
- package/src/services/voice/voice-profile-artifact.test.ts +138 -0
- package/src/services/voice/voice-profile-artifact.ts +518 -0
- package/src/services/voice/voice-profile-routes.d.ts +83 -0
- package/src/services/voice/voice-profile-routes.d.ts.map +1 -0
- package/src/services/voice/voice-profile-routes.test.ts +429 -0
- package/src/services/voice/voice-profile-routes.ts +425 -0
- package/src/services/voice/voice-scenario.ts +154 -0
- package/src/services/voice/voice-settings.d.ts +82 -0
- package/src/services/voice/voice-settings.d.ts.map +1 -0
- package/src/services/voice/voice-settings.ts +172 -0
- package/src/services/voice/voice-state-machine.d.ts +364 -0
- package/src/services/voice/voice-state-machine.d.ts.map +1 -0
- package/src/services/voice/voice-state-machine.ts +727 -0
- package/src/services/voice/voice-workbench-report.test.ts +168 -0
- package/src/services/voice/voice-workbench-report.ts +326 -0
- package/src/services/voice/voice-workbench.test.ts +158 -0
- package/src/services/voice/voice.test.ts +1070 -0
- package/src/services/voice/wake-word-ggml.d.ts +101 -0
- package/src/services/voice/wake-word-ggml.d.ts.map +1 -0
- package/src/services/voice/wake-word-ggml.ts +320 -0
- package/src/services/voice/wake-word.d.ts +255 -0
- package/src/services/voice/wake-word.d.ts.map +1 -0
- package/src/services/voice/wake-word.test.ts +298 -0
- package/src/services/voice/wake-word.ts +554 -0
- package/src/services/voice/wrap-with-first-line-cache.d.ts +70 -0
- package/src/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
- package/src/services/voice/wrap-with-first-line-cache.ts +267 -0
- package/src/services/voice-model-updater.d.ts +240 -0
- package/src/services/voice-model-updater.d.ts.map +1 -0
- package/src/services/voice-model-updater.ts +724 -0
- package/src/services/voice-prewarm.d.ts +3 -0
- package/src/services/voice-prewarm.d.ts.map +1 -0
- package/src/services/voice-prewarm.ts +51 -0
- package/dist/index.d.ts +0 -37
- package/dist/index.js +0 -1098
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import https from "node:https";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { resolveStateDir } from "@elizaos/core";
|
|
5
|
+
import { formatByteSize, getLogPrefix } from "@elizaos/shared";
|
|
6
|
+
import { EMBEDDING_PRESETS } from "./embedding-presets.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Callback for reporting download/init progress.
|
|
10
|
+
* @param phase - Current phase: "checking", "downloading", "loading", "ready"
|
|
11
|
+
* @param detail - Human-readable detail (e.g. "45% of 95 MB")
|
|
12
|
+
*/
|
|
13
|
+
export type EmbeddingProgressCallback = (
|
|
14
|
+
phase: "checking" | "downloading" | "loading" | "ready",
|
|
15
|
+
detail?: string,
|
|
16
|
+
) => void;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Callback for raw download byte progress.
|
|
20
|
+
* @param downloaded - Bytes received so far
|
|
21
|
+
* @param total - Total bytes expected (null if Content-Length unavailable)
|
|
22
|
+
*/
|
|
23
|
+
export type DownloadProgressCallback = (
|
|
24
|
+
downloaded: number,
|
|
25
|
+
total: number | null,
|
|
26
|
+
) => void;
|
|
27
|
+
|
|
28
|
+
export interface EmbeddingManagerConfig {
|
|
29
|
+
/** GGUF model filename (default: detected hardware preset) */
|
|
30
|
+
model?: string;
|
|
31
|
+
/** HuggingFace repo for auto-download (default: detected hardware preset repo) */
|
|
32
|
+
modelRepo?: string;
|
|
33
|
+
/** Embedding dimensions (default: detected hardware preset dimensions) */
|
|
34
|
+
dimensions?: number;
|
|
35
|
+
/** GPU layers: "auto" | "max" | number (default: detected hardware preset gpuLayers) */
|
|
36
|
+
gpuLayers?: "auto" | "max" | number;
|
|
37
|
+
/** Model context window in tokens (default: detected hardware preset contextSize) */
|
|
38
|
+
contextSize?: number;
|
|
39
|
+
/** Idle timeout in ms before unloading model (default: 1800000 = 30 min, 0 = never unload) */
|
|
40
|
+
idleTimeoutMs?: number;
|
|
41
|
+
/** Models directory (default: <stateDir>/models) */
|
|
42
|
+
modelsDir?: string;
|
|
43
|
+
/** Optional callback for reporting initialization progress phases. */
|
|
44
|
+
onProgress?: EmbeddingProgressCallback;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface EmbeddingManagerStats {
|
|
48
|
+
lastUsedAt: number | null;
|
|
49
|
+
isLoaded: boolean;
|
|
50
|
+
model: string;
|
|
51
|
+
gpuLayers: string | number;
|
|
52
|
+
dimensions: number;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export const DEFAULT_IDLE_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
|
|
56
|
+
export const DEFAULT_MODELS_DIR = path.join(resolveStateDir(), "models");
|
|
57
|
+
|
|
58
|
+
const EMBEDDING_META_DIR =
|
|
59
|
+
process.env.ELIZA_EMBEDDING_META_DIR ?? path.join(resolveStateDir(), "state");
|
|
60
|
+
export const EMBEDDING_META_PATH =
|
|
61
|
+
process.env.ELIZA_EMBEDDING_META_PATH ??
|
|
62
|
+
path.join(EMBEDDING_META_DIR, "embedding-meta.json");
|
|
63
|
+
|
|
64
|
+
let _logger:
|
|
65
|
+
| {
|
|
66
|
+
info: (...a: unknown[]) => void;
|
|
67
|
+
warn: (...a: unknown[]) => void;
|
|
68
|
+
error: (...a: unknown[]) => void;
|
|
69
|
+
debug: (...a: unknown[]) => void;
|
|
70
|
+
}
|
|
71
|
+
| undefined;
|
|
72
|
+
|
|
73
|
+
export function getLogger() {
|
|
74
|
+
if (_logger) return _logger;
|
|
75
|
+
try {
|
|
76
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
77
|
+
const core = require("@elizaos/core");
|
|
78
|
+
if (core?.logger) {
|
|
79
|
+
_logger = core.logger;
|
|
80
|
+
return _logger as NonNullable<typeof _logger>;
|
|
81
|
+
}
|
|
82
|
+
} catch {
|
|
83
|
+
// Fallback below
|
|
84
|
+
}
|
|
85
|
+
_logger = console;
|
|
86
|
+
return _logger;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
interface EmbeddingMeta {
|
|
90
|
+
model: string;
|
|
91
|
+
dimensions: number;
|
|
92
|
+
lastChanged: string;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function readEmbeddingMeta(): EmbeddingMeta | null {
|
|
96
|
+
try {
|
|
97
|
+
if (!fs.existsSync(EMBEDDING_META_PATH)) return null;
|
|
98
|
+
return JSON.parse(
|
|
99
|
+
fs.readFileSync(EMBEDDING_META_PATH, "utf-8"),
|
|
100
|
+
) as EmbeddingMeta;
|
|
101
|
+
} catch {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function writeEmbeddingMeta(meta: EmbeddingMeta): void {
|
|
107
|
+
try {
|
|
108
|
+
fs.mkdirSync(EMBEDDING_META_DIR, { recursive: true });
|
|
109
|
+
fs.writeFileSync(EMBEDDING_META_PATH, JSON.stringify(meta, null, 2));
|
|
110
|
+
} catch (err) {
|
|
111
|
+
getLogger().warn(
|
|
112
|
+
`${getLogPrefix()} Failed to write embedding metadata: ${err}`,
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function checkDimensionMigration(
|
|
118
|
+
model: string,
|
|
119
|
+
dimensions: number,
|
|
120
|
+
): void {
|
|
121
|
+
const log = getLogger();
|
|
122
|
+
const stored = readEmbeddingMeta();
|
|
123
|
+
|
|
124
|
+
if (stored && stored.dimensions !== dimensions) {
|
|
125
|
+
log.warn(
|
|
126
|
+
`${getLogPrefix()} Embedding dimensions changed (${stored.dimensions} → ${dimensions}). ` +
|
|
127
|
+
"Existing memory embeddings will be re-indexed on next access.",
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
writeEmbeddingMeta({
|
|
132
|
+
model,
|
|
133
|
+
dimensions,
|
|
134
|
+
lastChanged: new Date().toISOString(),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function safeUnlink(filepath: string): void {
|
|
139
|
+
try {
|
|
140
|
+
if (fs.existsSync(filepath)) fs.unlinkSync(filepath);
|
|
141
|
+
} catch {
|
|
142
|
+
// best-effort cleanup
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export function getErrorMessage(error: unknown): string {
|
|
147
|
+
if (error instanceof Error) return error.message;
|
|
148
|
+
if (typeof error === "string") return error;
|
|
149
|
+
if (
|
|
150
|
+
error != null &&
|
|
151
|
+
typeof error === "object" &&
|
|
152
|
+
"message" in error &&
|
|
153
|
+
typeof (error as { message?: unknown }).message === "string"
|
|
154
|
+
) {
|
|
155
|
+
return (error as { message: string }).message;
|
|
156
|
+
}
|
|
157
|
+
return String(error);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export function isCorruptedModelLoadError(error: unknown): boolean {
|
|
161
|
+
const message = getErrorMessage(error).toLowerCase();
|
|
162
|
+
return (
|
|
163
|
+
message.includes("failed to load model") ||
|
|
164
|
+
message.includes("data is not within the file bounds") ||
|
|
165
|
+
(message.includes("tensor") && message.includes("is corrupted")) ||
|
|
166
|
+
message.includes("model is corrupted")
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function parseContentLength(
|
|
171
|
+
contentLength: string | string[] | undefined,
|
|
172
|
+
): number | null {
|
|
173
|
+
if (!contentLength || Array.isArray(contentLength)) return null;
|
|
174
|
+
const parsed = Number.parseInt(contentLength, 10);
|
|
175
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function isAllowedDownloadHost(hostname: string): boolean {
|
|
179
|
+
return (
|
|
180
|
+
hostname === "huggingface.co" ||
|
|
181
|
+
hostname.endsWith(".huggingface.co") ||
|
|
182
|
+
hostname === "hf.co" ||
|
|
183
|
+
hostname.endsWith(".hf.co")
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function validateDownloadUrl(rawUrl: string): URL {
|
|
188
|
+
let parsed: URL;
|
|
189
|
+
try {
|
|
190
|
+
parsed = new URL(rawUrl);
|
|
191
|
+
} catch {
|
|
192
|
+
throw new Error(`Download failed: invalid URL "${rawUrl}"`);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (parsed.protocol !== "https:") {
|
|
196
|
+
throw new Error("Download failed: only https:// URLs are allowed");
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (!isAllowedDownloadHost(parsed.hostname.toLowerCase())) {
|
|
200
|
+
throw new Error(
|
|
201
|
+
`Download failed: host "${parsed.hostname}" is not allowed`,
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return parsed;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function sanitizeModelRepo(repo: string): string {
|
|
209
|
+
const trimmed = repo.trim();
|
|
210
|
+
if (!/^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/.test(trimmed)) {
|
|
211
|
+
throw new Error(`Invalid embedding model repo: ${repo}`);
|
|
212
|
+
}
|
|
213
|
+
return trimmed;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function sanitizeModelFilename(filename: string): string {
|
|
217
|
+
const trimmed = filename.trim();
|
|
218
|
+
// Permit forward-slash separated path segments so canonical HF-style ids like
|
|
219
|
+
// `text/eliza-1-2b-128k.gguf` (a real subdirectory in the upstream repo
|
|
220
|
+
// and the on-disk layout under `modelsDir`) pass validation. Each segment is
|
|
221
|
+
// restricted to `[A-Za-z0-9._-]+`, which alone would let `.` / `..` through;
|
|
222
|
+
// we reject those explicitly below. `resolveModelPath` provides
|
|
223
|
+
// defense-in-depth via a realpath comparison against `modelsDir`.
|
|
224
|
+
if (!/^[A-Za-z0-9._-]+(\/[A-Za-z0-9._-]+)*\.gguf$/i.test(trimmed)) {
|
|
225
|
+
throw new Error(`Invalid embedding model filename: ${filename}`);
|
|
226
|
+
}
|
|
227
|
+
for (const segment of trimmed.split("/")) {
|
|
228
|
+
if (segment === "." || segment === "..") {
|
|
229
|
+
throw new Error(`Invalid embedding model filename: ${filename}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return trimmed;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function resolveModelPath(modelsDir: string, filename: string): string {
|
|
236
|
+
const resolvedDir = path.resolve(modelsDir);
|
|
237
|
+
const resolvedPath = path.resolve(resolvedDir, filename);
|
|
238
|
+
if (
|
|
239
|
+
resolvedPath !== resolvedDir &&
|
|
240
|
+
!resolvedPath.startsWith(`${resolvedDir}${path.sep}`)
|
|
241
|
+
) {
|
|
242
|
+
throw new Error("Invalid embedding model path");
|
|
243
|
+
}
|
|
244
|
+
return resolvedPath;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/** Known TEXT_EMBEDDING GGUFs the framework may warm up (same filenames as HuggingFace repos). */
|
|
248
|
+
export interface WarmupReuseEmbeddingCandidate {
|
|
249
|
+
readonly model: string;
|
|
250
|
+
readonly modelRepo: string;
|
|
251
|
+
readonly dimensions: number;
|
|
252
|
+
readonly contextSize: number;
|
|
253
|
+
readonly gpuLayers: string;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function warmupReuseEmbeddingCandidates(): WarmupReuseEmbeddingCandidate[] {
|
|
257
|
+
return [
|
|
258
|
+
{
|
|
259
|
+
model: EMBEDDING_PRESETS.performance.model,
|
|
260
|
+
modelRepo: EMBEDDING_PRESETS.performance.modelRepo,
|
|
261
|
+
dimensions: EMBEDDING_PRESETS.performance.dimensions,
|
|
262
|
+
contextSize: EMBEDDING_PRESETS.performance.contextSize,
|
|
263
|
+
gpuLayers: String(EMBEDDING_PRESETS.performance.gpuLayers),
|
|
264
|
+
},
|
|
265
|
+
];
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/** True if a sanitized GGUF with this basename exists under `modelsDir`. */
|
|
269
|
+
export function embeddingGgufFilePresent(
|
|
270
|
+
modelsDir: string,
|
|
271
|
+
filename: string,
|
|
272
|
+
): boolean {
|
|
273
|
+
try {
|
|
274
|
+
const safe = sanitizeModelFilename(filename);
|
|
275
|
+
return fs.existsSync(resolveModelPath(modelsDir, safe));
|
|
276
|
+
} catch {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* When the configured embedding file is missing, reuse only the compact,
|
|
283
|
+
* SQL-safe embedding GGUF already on disk. The framework intentionally avoids
|
|
284
|
+
* reviving legacy larger defaults from MODELS_DIR because they would reintroduce
|
|
285
|
+
* dimension mismatches and unnecessary RAM/download cost.
|
|
286
|
+
*/
|
|
287
|
+
export function findExistingEmbeddingModelForWarmupReuse(
|
|
288
|
+
modelsDir: string,
|
|
289
|
+
): WarmupReuseEmbeddingCandidate | null {
|
|
290
|
+
const dir = path.resolve(modelsDir);
|
|
291
|
+
if (!fs.existsSync(dir)) {
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
for (const c of warmupReuseEmbeddingCandidates()) {
|
|
295
|
+
if (embeddingGgufFilePresent(dir, c.model)) {
|
|
296
|
+
return c;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return null;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
export function isEmbeddingWarmupReuseDisabled(): boolean {
|
|
303
|
+
const raw =
|
|
304
|
+
process.env.ELIZA_EMBEDDING_WARMUP_NO_REUSE?.trim().toLowerCase() ?? "";
|
|
305
|
+
return raw === "1" || raw === "true" || raw === "yes";
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/** Alias for the shared byte-size formatter with precision tuned for download progress. */
|
|
309
|
+
function formatBytes(bytes: number): string {
|
|
310
|
+
return formatByteSize(bytes, {
|
|
311
|
+
kbPrecision: 0,
|
|
312
|
+
mbPrecision: 1,
|
|
313
|
+
gbPrecision: 2,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
function downloadFile(
|
|
318
|
+
url: string,
|
|
319
|
+
dest: string,
|
|
320
|
+
maxRedirects = 5,
|
|
321
|
+
onProgress?: DownloadProgressCallback,
|
|
322
|
+
): Promise<void> {
|
|
323
|
+
return new Promise<void>((resolve, reject) => {
|
|
324
|
+
let settled = false;
|
|
325
|
+
let redirectCount = 0;
|
|
326
|
+
|
|
327
|
+
const request = (reqUrl: string) => {
|
|
328
|
+
let validatedUrl: URL;
|
|
329
|
+
try {
|
|
330
|
+
validatedUrl = validateDownloadUrl(reqUrl);
|
|
331
|
+
} catch (error) {
|
|
332
|
+
reject(
|
|
333
|
+
error instanceof Error ? error : new Error("Invalid download URL"),
|
|
334
|
+
);
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
const file = fs.createWriteStream(dest);
|
|
339
|
+
let bytesReceived = 0;
|
|
340
|
+
let expectedBytes: number | null = null;
|
|
341
|
+
let lastProgressPercent = -1;
|
|
342
|
+
|
|
343
|
+
const settleError = (err: Error) => {
|
|
344
|
+
if (settled) return;
|
|
345
|
+
settled = true;
|
|
346
|
+
file.close();
|
|
347
|
+
safeUnlink(dest);
|
|
348
|
+
reject(err);
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
const settleSuccess = () => {
|
|
352
|
+
if (settled) return;
|
|
353
|
+
if (expectedBytes != null && bytesReceived !== expectedBytes) {
|
|
354
|
+
settleError(
|
|
355
|
+
new Error(
|
|
356
|
+
`${getLogPrefix()} Download failed: bytes received (${bytesReceived}) ` +
|
|
357
|
+
`does not match Content-Length (${expectedBytes})`,
|
|
358
|
+
),
|
|
359
|
+
);
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
settled = true;
|
|
363
|
+
file.close();
|
|
364
|
+
resolve();
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
// Gated HuggingFace repos (and ungated ones whose LFS redirects hit
|
|
368
|
+
// a metered endpoint) accept a bearer token via the HF_TOKEN /
|
|
369
|
+
// HUGGINGFACE_TOKEN / HF_HUB_TOKEN env vars. Without it the
|
|
370
|
+
// download returns 401. We pass the token on every redirect hop
|
|
371
|
+
// (same request() closure handles redirects).
|
|
372
|
+
const hfToken =
|
|
373
|
+
process.env.HF_TOKEN?.trim() ||
|
|
374
|
+
process.env.HUGGINGFACE_TOKEN?.trim() ||
|
|
375
|
+
process.env.HF_HUB_TOKEN?.trim() ||
|
|
376
|
+
"";
|
|
377
|
+
const downloadHeaders: Record<string, string> = {
|
|
378
|
+
"User-Agent": "eliza",
|
|
379
|
+
};
|
|
380
|
+
if (hfToken) {
|
|
381
|
+
downloadHeaders.Authorization = `Bearer ${hfToken}`;
|
|
382
|
+
}
|
|
383
|
+
https
|
|
384
|
+
.get(validatedUrl.toString(), { headers: downloadHeaders }, (res) => {
|
|
385
|
+
expectedBytes = parseContentLength(res.headers["content-length"]);
|
|
386
|
+
if (
|
|
387
|
+
res.statusCode &&
|
|
388
|
+
res.statusCode >= 300 &&
|
|
389
|
+
res.statusCode < 400 &&
|
|
390
|
+
res.headers.location
|
|
391
|
+
) {
|
|
392
|
+
res.resume();
|
|
393
|
+
file.close();
|
|
394
|
+
safeUnlink(dest);
|
|
395
|
+
redirectCount += 1;
|
|
396
|
+
if (redirectCount > maxRedirects) {
|
|
397
|
+
settleError(
|
|
398
|
+
new Error(
|
|
399
|
+
`Download failed: too many redirects (>${maxRedirects})`,
|
|
400
|
+
),
|
|
401
|
+
);
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
let next: string;
|
|
405
|
+
try {
|
|
406
|
+
next = new URL(
|
|
407
|
+
res.headers.location,
|
|
408
|
+
validatedUrl.toString(),
|
|
409
|
+
).toString();
|
|
410
|
+
} catch {
|
|
411
|
+
settleError(
|
|
412
|
+
new Error(
|
|
413
|
+
`Download failed: malformed redirect URL "${res.headers.location}"`,
|
|
414
|
+
),
|
|
415
|
+
);
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
request(next);
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
if (res.statusCode !== 200) {
|
|
422
|
+
settleError(
|
|
423
|
+
new Error(
|
|
424
|
+
`Download failed: HTTP ${res.statusCode} for ${validatedUrl.toString()}`,
|
|
425
|
+
),
|
|
426
|
+
);
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
res.on("data", (chunk: Buffer) => {
|
|
430
|
+
bytesReceived += chunk.length;
|
|
431
|
+
if (onProgress) {
|
|
432
|
+
// Throttle callbacks to every 2% to avoid excessive updates
|
|
433
|
+
const pct = expectedBytes
|
|
434
|
+
? Math.floor((bytesReceived / expectedBytes) * 50)
|
|
435
|
+
: -1;
|
|
436
|
+
if (pct !== lastProgressPercent) {
|
|
437
|
+
lastProgressPercent = pct;
|
|
438
|
+
onProgress(bytesReceived, expectedBytes);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
res.pipe(file);
|
|
443
|
+
file.on("finish", settleSuccess);
|
|
444
|
+
file.on("error", settleError);
|
|
445
|
+
})
|
|
446
|
+
.on("error", settleError);
|
|
447
|
+
};
|
|
448
|
+
request(url);
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
export async function ensureModel(
|
|
453
|
+
modelsDir: string,
|
|
454
|
+
repo: string,
|
|
455
|
+
filename: string,
|
|
456
|
+
force?: boolean,
|
|
457
|
+
onProgress?: EmbeddingProgressCallback,
|
|
458
|
+
): Promise<string> {
|
|
459
|
+
const safeRepo = sanitizeModelRepo(repo);
|
|
460
|
+
const safeFilename = sanitizeModelFilename(filename);
|
|
461
|
+
const modelPath = resolveModelPath(modelsDir, safeFilename);
|
|
462
|
+
if (force) safeUnlink(modelPath);
|
|
463
|
+
|
|
464
|
+
onProgress?.("checking", safeFilename);
|
|
465
|
+
|
|
466
|
+
if (fs.existsSync(modelPath)) {
|
|
467
|
+
onProgress?.("ready", "model already downloaded");
|
|
468
|
+
return modelPath;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
const log = getLogger();
|
|
472
|
+
// modelPath may be namespaced (text/eliza-1.gguf); create the file's
|
|
473
|
+
// parent dir, not just modelsDir, or createWriteStream throws ENOENT.
|
|
474
|
+
fs.mkdirSync(path.dirname(path.resolve(modelPath)), { recursive: true });
|
|
475
|
+
|
|
476
|
+
const url = `https://huggingface.co/${safeRepo}/resolve/main/${safeFilename}`;
|
|
477
|
+
log.info(
|
|
478
|
+
`${getLogPrefix()} Downloading TEXT_EMBEDDING / memory vector model (not chat LLM): ${safeFilename} from ${safeRepo}`,
|
|
479
|
+
);
|
|
480
|
+
|
|
481
|
+
onProgress?.(
|
|
482
|
+
"downloading",
|
|
483
|
+
`${safeFilename} — TEXT_EMBEDDING for memory, not chat · ${safeRepo}`,
|
|
484
|
+
);
|
|
485
|
+
|
|
486
|
+
const downloadOnProgress: DownloadProgressCallback | undefined = onProgress
|
|
487
|
+
? (downloaded, total) => {
|
|
488
|
+
const totalStr = total ? formatBytes(total) : "unknown size";
|
|
489
|
+
const pct = total ? Math.round((downloaded / total) * 100) : 0;
|
|
490
|
+
onProgress("downloading", `${safeFilename} ${pct}% of ${totalStr}`);
|
|
491
|
+
}
|
|
492
|
+
: undefined;
|
|
493
|
+
|
|
494
|
+
await downloadFile(url, modelPath, 5, downloadOnProgress);
|
|
495
|
+
log.info(`${getLogPrefix()} Embedding model downloaded: ${modelPath}`);
|
|
496
|
+
return modelPath;
|
|
497
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type EmbeddingTier = "fallback" | "standard" | "performance";
|
|
2
|
+
export interface EmbeddingPreset {
|
|
3
|
+
tier: EmbeddingTier;
|
|
4
|
+
label: string;
|
|
5
|
+
description: string;
|
|
6
|
+
model: string;
|
|
7
|
+
modelRepo: string;
|
|
8
|
+
dimensions: number;
|
|
9
|
+
gpuLayers: "auto" | 0;
|
|
10
|
+
contextSize: number;
|
|
11
|
+
downloadSizeMB: number;
|
|
12
|
+
}
|
|
13
|
+
export declare const EMBEDDING_PRESETS: Record<EmbeddingTier, EmbeddingPreset>;
|
|
14
|
+
export declare function detectEmbeddingTier(): EmbeddingTier;
|
|
15
|
+
export declare function detectEmbeddingPreset(): EmbeddingPreset;
|
|
16
|
+
//# sourceMappingURL=embedding-presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-presets.d.ts","sourceRoot":"","sources":["embedding-presets.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,aAAa,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACvB;AAaD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,eAAe,CAqCpE,CAAC;AAIF,wBAAgB,mBAAmB,IAAI,aAAa,CAQnD;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CAEvD"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
|
|
3
|
+
export type EmbeddingTier = "fallback" | "standard" | "performance";
|
|
4
|
+
|
|
5
|
+
export interface EmbeddingPreset {
|
|
6
|
+
tier: EmbeddingTier;
|
|
7
|
+
label: string;
|
|
8
|
+
description: string;
|
|
9
|
+
model: string;
|
|
10
|
+
modelRepo: string;
|
|
11
|
+
dimensions: number;
|
|
12
|
+
gpuLayers: "auto" | 0;
|
|
13
|
+
contextSize: number;
|
|
14
|
+
downloadSizeMB: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const GTE_SMALL_EMBEDDING = {
|
|
18
|
+
// gte-small: 384-dim general-purpose text embedding, ~64MB fp16 GGUF.
|
|
19
|
+
// Chosen for broad device support (mobile included) and an exact match to
|
|
20
|
+
// plugin-sql's dim384 column — no truncation, no per-device model juggling.
|
|
21
|
+
model: "gte-small_fp16.gguf",
|
|
22
|
+
modelRepo: "ChristianAzinn/gte-small-gguf",
|
|
23
|
+
dimensions: 384,
|
|
24
|
+
contextSize: 512,
|
|
25
|
+
downloadSizeMB: 64,
|
|
26
|
+
} as const;
|
|
27
|
+
|
|
28
|
+
export const EMBEDDING_PRESETS: Record<EmbeddingTier, EmbeddingPreset> = {
|
|
29
|
+
fallback: {
|
|
30
|
+
tier: "fallback",
|
|
31
|
+
label: "Efficient (CPU)",
|
|
32
|
+
description:
|
|
33
|
+
"gte-small local embeddings for Intel Macs and low-RAM machines",
|
|
34
|
+
model: GTE_SMALL_EMBEDDING.model,
|
|
35
|
+
modelRepo: GTE_SMALL_EMBEDDING.modelRepo,
|
|
36
|
+
dimensions: GTE_SMALL_EMBEDDING.dimensions,
|
|
37
|
+
gpuLayers: 0,
|
|
38
|
+
contextSize: GTE_SMALL_EMBEDDING.contextSize,
|
|
39
|
+
downloadSizeMB: GTE_SMALL_EMBEDDING.downloadSizeMB,
|
|
40
|
+
},
|
|
41
|
+
standard: {
|
|
42
|
+
tier: "standard",
|
|
43
|
+
label: "Efficient (Metal GPU)",
|
|
44
|
+
description: "gte-small local embeddings with Metal acceleration",
|
|
45
|
+
model: GTE_SMALL_EMBEDDING.model,
|
|
46
|
+
modelRepo: GTE_SMALL_EMBEDDING.modelRepo,
|
|
47
|
+
dimensions: GTE_SMALL_EMBEDDING.dimensions,
|
|
48
|
+
gpuLayers: "auto",
|
|
49
|
+
contextSize: GTE_SMALL_EMBEDDING.contextSize,
|
|
50
|
+
downloadSizeMB: GTE_SMALL_EMBEDDING.downloadSizeMB,
|
|
51
|
+
},
|
|
52
|
+
performance: {
|
|
53
|
+
tier: "performance",
|
|
54
|
+
label: "Efficient (compact text embedding)",
|
|
55
|
+
description:
|
|
56
|
+
"384-dim gte-small text embedding model. Powers memory / knowledge vectors only; not chat. " +
|
|
57
|
+
"The framework keeps the default SQL-safe and fast instead of auto-selecting a multi-GB embedding GGUF.",
|
|
58
|
+
model: GTE_SMALL_EMBEDDING.model,
|
|
59
|
+
modelRepo: GTE_SMALL_EMBEDDING.modelRepo,
|
|
60
|
+
dimensions: GTE_SMALL_EMBEDDING.dimensions,
|
|
61
|
+
gpuLayers: "auto",
|
|
62
|
+
contextSize: GTE_SMALL_EMBEDDING.contextSize,
|
|
63
|
+
downloadSizeMB: GTE_SMALL_EMBEDDING.downloadSizeMB,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const BYTES_PER_GB = 1024 ** 3;
|
|
68
|
+
|
|
69
|
+
export function detectEmbeddingTier(): EmbeddingTier {
|
|
70
|
+
const totalRamGB = Math.round(os.totalmem() / BYTES_PER_GB);
|
|
71
|
+
const isMac = process.platform === "darwin";
|
|
72
|
+
const isAppleSilicon = isMac && process.arch === "arm64";
|
|
73
|
+
|
|
74
|
+
if (!isAppleSilicon || totalRamGB <= 8) return "fallback";
|
|
75
|
+
if (totalRamGB >= 128) return "performance";
|
|
76
|
+
return "standard";
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function detectEmbeddingPreset(): EmbeddingPreset {
|
|
80
|
+
return EMBEDDING_PRESETS[detectEmbeddingTier()];
|
|
81
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether to prefetch the local GGUF embedding model before runtime boot.
|
|
3
|
+
*
|
|
4
|
+
* Chat/inference provider (what you pick in first-run) is separate from
|
|
5
|
+
* **embeddings** (vector memory / RAG). By default the framework keeps
|
|
6
|
+
* `@elizaos/plugin-local-inference` loaded because API-based model plugins do
|
|
7
|
+
* not implement TEXT_EMBEDDING — so a local model was historically always
|
|
8
|
+
* warmed up. When Eliza Cloud is connected with **cloud embeddings** enabled,
|
|
9
|
+
* the cloud plugin handles embeddings instead; skipping warmup avoids a large
|
|
10
|
+
* download unrelated to “local inference” for chat.
|
|
11
|
+
*/
|
|
12
|
+
export declare function isLocalEmbeddingDisabledByEnv(): boolean;
|
|
13
|
+
export declare function shouldWarmupLocalEmbeddingModel(): boolean;
|
|
14
|
+
//# sourceMappingURL=embedding-warmup-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-warmup-policy.d.ts","sourceRoot":"","sources":["embedding-warmup-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,wBAAgB,6BAA6B,IAAI,OAAO,CAEvD;AAED,wBAAgB,+BAA+B,IAAI,OAAO,CAuBzD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { shouldWarmupLocalEmbeddingModel } from "./embedding-warmup-policy";
|
|
3
|
+
|
|
4
|
+
const ENV_KEYS = [
|
|
5
|
+
"ELIZA_SKIP_LOCAL_EMBEDDING_WARMUP",
|
|
6
|
+
"ELIZA_DISABLE_LOCAL_EMBEDDINGS",
|
|
7
|
+
"ELIZA_CLOUD_EMBEDDINGS_DISABLED",
|
|
8
|
+
"ELIZAOS_CLOUD_USE_EMBEDDINGS",
|
|
9
|
+
] as const;
|
|
10
|
+
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
for (const key of ENV_KEYS) {
|
|
13
|
+
delete process.env[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
describe("shouldWarmupLocalEmbeddingModel", () => {
|
|
18
|
+
it("warms local embeddings by default for local runtimes", () => {
|
|
19
|
+
expect(shouldWarmupLocalEmbeddingModel()).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("lets packaged desktop startup skip the large embedding prefetch", () => {
|
|
23
|
+
process.env.ELIZA_SKIP_LOCAL_EMBEDDING_WARMUP = "1";
|
|
24
|
+
process.env.ELIZA_CLOUD_EMBEDDINGS_DISABLED = "1";
|
|
25
|
+
|
|
26
|
+
expect(shouldWarmupLocalEmbeddingModel()).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("skips warmup when local embeddings are disabled", () => {
|
|
30
|
+
process.env.ELIZA_DISABLE_LOCAL_EMBEDDINGS = "1";
|
|
31
|
+
|
|
32
|
+
expect(shouldWarmupLocalEmbeddingModel()).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("skips warmup when cloud embeddings are enabled", () => {
|
|
36
|
+
process.env.ELIZAOS_CLOUD_USE_EMBEDDINGS = "1";
|
|
37
|
+
|
|
38
|
+
expect(shouldWarmupLocalEmbeddingModel()).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("keeps local warmup when cloud embeddings are explicitly disabled", () => {
|
|
42
|
+
process.env.ELIZA_CLOUD_EMBEDDINGS_DISABLED = "1";
|
|
43
|
+
|
|
44
|
+
expect(shouldWarmupLocalEmbeddingModel()).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("lets explicit startup skip win over cloud embedding disablement", () => {
|
|
48
|
+
process.env.ELIZA_SKIP_LOCAL_EMBEDDING_WARMUP = "true";
|
|
49
|
+
process.env.ELIZA_CLOUD_EMBEDDINGS_DISABLED = "true";
|
|
50
|
+
|
|
51
|
+
expect(shouldWarmupLocalEmbeddingModel()).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
});
|