@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,163 @@
|
|
|
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
|
+
|
|
80
|
+
import { existsSync } from "node:fs";
|
|
81
|
+
import { VisionBackendUnavailableError } from "./capacitor-llama";
|
|
82
|
+
import type { VisionDescribeBackend, VisionDescribeLoadArgs } from "./types";
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* The AOSP binding's mtmd surface, when present. The AOSP plugin
|
|
86
|
+
* registers an instance under the runtime service name
|
|
87
|
+
* `"aosp-llama-mtmd"` once the native shim exports the symbols above.
|
|
88
|
+
*/
|
|
89
|
+
export interface AospLlamaMtmdBinding {
|
|
90
|
+
/** True when libeliza-llama-shim.so was loaded and exports the mtmd symbols. */
|
|
91
|
+
hasMtmd(): boolean;
|
|
92
|
+
/** Initialize an mtmd handle for the given mmproj path. */
|
|
93
|
+
initMtmd(args: { mmprojPath: string }): Promise<AospMtmdHandle>;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface AospMtmdHandle {
|
|
97
|
+
/**
|
|
98
|
+
* Single-call describe — wraps mtmd_encode + decode_with_chunks. The
|
|
99
|
+
* AOSP shim's `eliza_llama_mtmd_describe` lands here. Backends that
|
|
100
|
+
* only have the split encode/decode symbols implement this on top
|
|
101
|
+
* of two FFI calls; backends with the fused symbol use one.
|
|
102
|
+
*/
|
|
103
|
+
describe(args: {
|
|
104
|
+
imageBytes: Uint8Array;
|
|
105
|
+
prompt: string;
|
|
106
|
+
maxTokens?: number;
|
|
107
|
+
temperature?: number;
|
|
108
|
+
signal?: AbortSignal;
|
|
109
|
+
}): Promise<string>;
|
|
110
|
+
/** Free the mtmd handle (and any cached encode buffers). */
|
|
111
|
+
dispose(): Promise<void>;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export interface LoadAospVisionBackendOptions {
|
|
115
|
+
loadArgs: VisionDescribeLoadArgs;
|
|
116
|
+
mtmdBinding?: AospLlamaMtmdBinding;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export async function loadAospVisionBackend(
|
|
120
|
+
opts: LoadAospVisionBackendOptions,
|
|
121
|
+
): Promise<VisionDescribeBackend> {
|
|
122
|
+
const { loadArgs, mtmdBinding } = opts;
|
|
123
|
+
if (!mtmdBinding?.hasMtmd()) {
|
|
124
|
+
throw new VisionBackendUnavailableError(
|
|
125
|
+
"aosp",
|
|
126
|
+
"binding_missing_mtmd",
|
|
127
|
+
"[vision/aosp] libeliza-llama-shim does not export the mtmd symbols. The AOSP shim needs eliza_llama_mtmd_init_from_file / _encode / _describe / _free. Until the native side exports them, vision-describe on AOSP falls back to the cloud path (or stays disabled when the user opted out of cloud).",
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
if (!existsSync(loadArgs.mmprojPath)) {
|
|
131
|
+
throw new VisionBackendUnavailableError(
|
|
132
|
+
"aosp",
|
|
133
|
+
"mmproj_missing",
|
|
134
|
+
`[vision/aosp] mmproj GGUF not found: ${loadArgs.mmprojPath}`,
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
const handle = await mtmdBinding.initMtmd({
|
|
138
|
+
mmprojPath: loadArgs.mmprojPath,
|
|
139
|
+
});
|
|
140
|
+
return {
|
|
141
|
+
id: "aosp",
|
|
142
|
+
async describe(request) {
|
|
143
|
+
const { resolveImageBytes } = await import("./hash");
|
|
144
|
+
const { bytes } = resolveImageBytes(request.image);
|
|
145
|
+
const text = await handle.describe({
|
|
146
|
+
imageBytes: bytes,
|
|
147
|
+
prompt: request.prompt ?? "Describe what is in this image.",
|
|
148
|
+
maxTokens: request.maxTokens,
|
|
149
|
+
temperature: request.temperature,
|
|
150
|
+
signal: request.signal,
|
|
151
|
+
});
|
|
152
|
+
const trimmed = text.trim();
|
|
153
|
+
if (!trimmed) {
|
|
154
|
+
throw new Error("[vision/aosp] empty text from mtmd_describe");
|
|
155
|
+
}
|
|
156
|
+
const title = trimmed.split(/[.!?]/, 1)[0]?.trim() || "Image";
|
|
157
|
+
return { title, description: trimmed, cacheHit: false };
|
|
158
|
+
},
|
|
159
|
+
async dispose() {
|
|
160
|
+
await handle.dispose();
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capacitor-llama vision-describe backend (WS2).
|
|
3
|
+
*
|
|
4
|
+
* Wraps the in-process capacitor-llama binding's multimodal projector
|
|
5
|
+
* (mtmd) surface and exposes the WS2 `VisionDescribeBackend` contract.
|
|
6
|
+
*
|
|
7
|
+
* State of the binding (2026-05-19):
|
|
8
|
+
* `llama-cpp-capacitor`'s `LlamaContext` exposes `initMultimodal` and
|
|
9
|
+
* `getMultimodalSupport`, which load an mmproj alongside the chat
|
|
10
|
+
* target. The desktop bun:ffi shim does not yet bind those symbols —
|
|
11
|
+
* the desktop FFI path returns `binding_missing_mtmd` until the shim
|
|
12
|
+
* adds `mtmd_init_from_file` + the encode/decode helpers.
|
|
13
|
+
*
|
|
14
|
+
* What this module does today:
|
|
15
|
+
* - Provides the WS2-shaped backend so plugin-vision / plugin-image-gen /
|
|
16
|
+
* computer-use can compile against a stable contract.
|
|
17
|
+
* - When the binding exposes the mtmd API, the backend dispatches
|
|
18
|
+
* through it.
|
|
19
|
+
* - Otherwise, the backend falls back to an injected
|
|
20
|
+
* `VisionManagerLike` implementation when one is supplied (kept as a
|
|
21
|
+
* pluggable seam for tests and out-of-tree integrations).
|
|
22
|
+
* - When neither path is wired, `describe()` throws a structured
|
|
23
|
+
* `VisionBackendUnavailableError` the arbiter surfaces upward.
|
|
24
|
+
*
|
|
25
|
+
* GPU validation status (this host has neither GPU):
|
|
26
|
+
* The mtmd encode path is GPU-accelerated when the underlying llama.cpp
|
|
27
|
+
* build dispatches `llama_image_t` through the model's batch path. We
|
|
28
|
+
* document the on-device validation that's required for each GPU
|
|
29
|
+
* family at the bottom of this file's tests (see
|
|
30
|
+
* `__tests__/vision-describe.test.ts`). Until those run on real
|
|
31
|
+
* hardware, GPU-backed vision is "implementation present, not
|
|
32
|
+
* validated".
|
|
33
|
+
*/
|
|
34
|
+
import type { VisionDescribeBackend, VisionDescribeBackendOptions, VisionDescribeLoadArgs } from "./types";
|
|
35
|
+
export declare class VisionBackendUnavailableError extends Error {
|
|
36
|
+
readonly backendId: string;
|
|
37
|
+
readonly reason: "binding_missing_mtmd" | "no_fallback_present" | "mmproj_missing";
|
|
38
|
+
readonly code = "VISION_BACKEND_UNAVAILABLE";
|
|
39
|
+
constructor(backendId: string, reason: "binding_missing_mtmd" | "no_fallback_present" | "mmproj_missing", message: string);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Optional shape the Capacitor-llama binding exposes once the mtmd typed
|
|
43
|
+
* wrappers land in the shared adapter. The backend only consumes
|
|
44
|
+
* `describeWithMmproj`, which wraps `LlamaContext.initMultimodal` +
|
|
45
|
+
* `completion(...)` with `media_paths`. Backends that don't satisfy this
|
|
46
|
+
* shape are treated as "binding without mtmd support" and the fallback
|
|
47
|
+
* path is used.
|
|
48
|
+
*/
|
|
49
|
+
export interface CapacitorLlamaMtmdBinding {
|
|
50
|
+
loadVisionModel(args: {
|
|
51
|
+
modelPath: string;
|
|
52
|
+
mmprojPath: string;
|
|
53
|
+
gpuLayers?: number | "auto" | "max";
|
|
54
|
+
contextSize?: number;
|
|
55
|
+
}): Promise<CapacitorLlamaMtmdHandle>;
|
|
56
|
+
}
|
|
57
|
+
export interface CapacitorLlamaMtmdHandle {
|
|
58
|
+
describeWithMmproj(args: {
|
|
59
|
+
imageBytes: Uint8Array;
|
|
60
|
+
mimeType?: string;
|
|
61
|
+
prompt: string;
|
|
62
|
+
maxTokens?: number;
|
|
63
|
+
temperature?: number;
|
|
64
|
+
signal?: AbortSignal;
|
|
65
|
+
projectedTokens?: VisionDescribeBackendOptions["projectedTokens"];
|
|
66
|
+
}): Promise<{
|
|
67
|
+
text: string;
|
|
68
|
+
projectorMs?: number;
|
|
69
|
+
decodeMs?: number;
|
|
70
|
+
}>;
|
|
71
|
+
dispose(): Promise<void>;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Optional VisionManager-shape fallback. Kept available as a pluggable
|
|
75
|
+
* injection point for tests and out-of-tree integrations that want to
|
|
76
|
+
* supply their own image captioning implementation.
|
|
77
|
+
*/
|
|
78
|
+
export interface VisionManagerLike {
|
|
79
|
+
processImage(dataUrl: string): Promise<{
|
|
80
|
+
title: string;
|
|
81
|
+
description: string;
|
|
82
|
+
}>;
|
|
83
|
+
}
|
|
84
|
+
export interface CapacitorLlamaVisionBackendOptions {
|
|
85
|
+
loadArgs: VisionDescribeLoadArgs;
|
|
86
|
+
/**
|
|
87
|
+
* Injected by tests and by the shared mtmd typed wrappers. When
|
|
88
|
+
* provided the backend uses the mtmd path.
|
|
89
|
+
*/
|
|
90
|
+
mtmd?: CapacitorLlamaMtmdBinding;
|
|
91
|
+
/**
|
|
92
|
+
* Caption-only fallback. Optional — when present the backend uses it
|
|
93
|
+
* as last resort, after mtmd. Backends that have neither throw a
|
|
94
|
+
* structured `VisionBackendUnavailableError`.
|
|
95
|
+
*/
|
|
96
|
+
visionManager?: VisionManagerLike;
|
|
97
|
+
}
|
|
98
|
+
export declare function loadCapacitorLlamaVisionBackend(opts: CapacitorLlamaVisionBackendOptions): Promise<VisionDescribeBackend>;
|
|
99
|
+
//# sourceMappingURL=capacitor-llama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capacitor-llama.d.ts","sourceRoot":"","sources":["capacitor-llama.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAIH,OAAO,KAAK,EACX,qBAAqB,EACrB,4BAA4B,EAC5B,sBAAsB,EAGtB,MAAM,SAAS,CAAC;AAEjB,qBAAa,6BAA8B,SAAQ,KAAK;IAGtD,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,MAAM,EACZ,sBAAsB,GACtB,qBAAqB,GACrB,gBAAgB;IANpB,QAAQ,CAAC,IAAI,gCAAgC;gBAEnC,SAAS,EAAE,MAAM,EACjB,MAAM,EACZ,sBAAsB,GACtB,qBAAqB,GACrB,gBAAgB,EACnB,OAAO,EAAE,MAAM;CAKhB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,yBAAyB;IACzC,eAAe,CAAC,IAAI,EAAE;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;QACpC,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,wBAAwB;IACxC,kBAAkB,CAAC,IAAI,EAAE;QACxB,UAAU,EAAE,UAAU,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,eAAe,CAAC,EAAE,4BAA4B,CAAC,iBAAiB,CAAC,CAAC;KAClE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,YAAY,CACX,OAAO,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,kCAAkC;IAClD,QAAQ,EAAE,sBAAsB,CAAC;IACjC;;;OAGG;IACH,IAAI,CAAC,EAAE,yBAAyB,CAAC;IACjC;;;;OAIG;IACH,aAAa,CAAC,EAAE,iBAAiB,CAAC;CAClC;AAID,wBAAsB,+BAA+B,CACpD,IAAI,EAAE,kCAAkC,GACtC,OAAO,CAAC,qBAAqB,CAAC,CA2EhC"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capacitor-llama vision-describe backend (WS2).
|
|
3
|
+
*
|
|
4
|
+
* Wraps the in-process capacitor-llama binding's multimodal projector
|
|
5
|
+
* (mtmd) surface and exposes the WS2 `VisionDescribeBackend` contract.
|
|
6
|
+
*
|
|
7
|
+
* State of the binding (2026-05-19):
|
|
8
|
+
* `llama-cpp-capacitor`'s `LlamaContext` exposes `initMultimodal` and
|
|
9
|
+
* `getMultimodalSupport`, which load an mmproj alongside the chat
|
|
10
|
+
* target. The desktop bun:ffi shim does not yet bind those symbols —
|
|
11
|
+
* the desktop FFI path returns `binding_missing_mtmd` until the shim
|
|
12
|
+
* adds `mtmd_init_from_file` + the encode/decode helpers.
|
|
13
|
+
*
|
|
14
|
+
* What this module does today:
|
|
15
|
+
* - Provides the WS2-shaped backend so plugin-vision / plugin-image-gen /
|
|
16
|
+
* computer-use can compile against a stable contract.
|
|
17
|
+
* - When the binding exposes the mtmd API, the backend dispatches
|
|
18
|
+
* through it.
|
|
19
|
+
* - Otherwise, the backend falls back to an injected
|
|
20
|
+
* `VisionManagerLike` implementation when one is supplied (kept as a
|
|
21
|
+
* pluggable seam for tests and out-of-tree integrations).
|
|
22
|
+
* - When neither path is wired, `describe()` throws a structured
|
|
23
|
+
* `VisionBackendUnavailableError` the arbiter surfaces upward.
|
|
24
|
+
*
|
|
25
|
+
* GPU validation status (this host has neither GPU):
|
|
26
|
+
* The mtmd encode path is GPU-accelerated when the underlying llama.cpp
|
|
27
|
+
* build dispatches `llama_image_t` through the model's batch path. We
|
|
28
|
+
* document the on-device validation that's required for each GPU
|
|
29
|
+
* family at the bottom of this file's tests (see
|
|
30
|
+
* `__tests__/vision-describe.test.ts`). Until those run on real
|
|
31
|
+
* hardware, GPU-backed vision is "implementation present, not
|
|
32
|
+
* validated".
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import { existsSync, promises as fs } from "node:fs";
|
|
36
|
+
import { resolveImageBytes } from "./hash";
|
|
37
|
+
import type {
|
|
38
|
+
VisionDescribeBackend,
|
|
39
|
+
VisionDescribeBackendOptions,
|
|
40
|
+
VisionDescribeLoadArgs,
|
|
41
|
+
VisionDescribeRequest,
|
|
42
|
+
VisionDescribeResult,
|
|
43
|
+
} from "./types";
|
|
44
|
+
|
|
45
|
+
export class VisionBackendUnavailableError extends Error {
|
|
46
|
+
readonly code = "VISION_BACKEND_UNAVAILABLE";
|
|
47
|
+
constructor(
|
|
48
|
+
readonly backendId: string,
|
|
49
|
+
readonly reason:
|
|
50
|
+
| "binding_missing_mtmd"
|
|
51
|
+
| "no_fallback_present"
|
|
52
|
+
| "mmproj_missing",
|
|
53
|
+
message: string,
|
|
54
|
+
) {
|
|
55
|
+
super(message);
|
|
56
|
+
this.name = "VisionBackendUnavailableError";
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Optional shape the Capacitor-llama binding exposes once the mtmd typed
|
|
62
|
+
* wrappers land in the shared adapter. The backend only consumes
|
|
63
|
+
* `describeWithMmproj`, which wraps `LlamaContext.initMultimodal` +
|
|
64
|
+
* `completion(...)` with `media_paths`. Backends that don't satisfy this
|
|
65
|
+
* shape are treated as "binding without mtmd support" and the fallback
|
|
66
|
+
* path is used.
|
|
67
|
+
*/
|
|
68
|
+
export interface CapacitorLlamaMtmdBinding {
|
|
69
|
+
loadVisionModel(args: {
|
|
70
|
+
modelPath: string;
|
|
71
|
+
mmprojPath: string;
|
|
72
|
+
gpuLayers?: number | "auto" | "max";
|
|
73
|
+
contextSize?: number;
|
|
74
|
+
}): Promise<CapacitorLlamaMtmdHandle>;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface CapacitorLlamaMtmdHandle {
|
|
78
|
+
describeWithMmproj(args: {
|
|
79
|
+
imageBytes: Uint8Array;
|
|
80
|
+
mimeType?: string;
|
|
81
|
+
prompt: string;
|
|
82
|
+
maxTokens?: number;
|
|
83
|
+
temperature?: number;
|
|
84
|
+
signal?: AbortSignal;
|
|
85
|
+
projectedTokens?: VisionDescribeBackendOptions["projectedTokens"];
|
|
86
|
+
}): Promise<{ text: string; projectorMs?: number; decodeMs?: number }>;
|
|
87
|
+
dispose(): Promise<void>;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Optional VisionManager-shape fallback. Kept available as a pluggable
|
|
92
|
+
* injection point for tests and out-of-tree integrations that want to
|
|
93
|
+
* supply their own image captioning implementation.
|
|
94
|
+
*/
|
|
95
|
+
export interface VisionManagerLike {
|
|
96
|
+
processImage(
|
|
97
|
+
dataUrl: string,
|
|
98
|
+
): Promise<{ title: string; description: string }>;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface CapacitorLlamaVisionBackendOptions {
|
|
102
|
+
loadArgs: VisionDescribeLoadArgs;
|
|
103
|
+
/**
|
|
104
|
+
* Injected by tests and by the shared mtmd typed wrappers. When
|
|
105
|
+
* provided the backend uses the mtmd path.
|
|
106
|
+
*/
|
|
107
|
+
mtmd?: CapacitorLlamaMtmdBinding;
|
|
108
|
+
/**
|
|
109
|
+
* Caption-only fallback. Optional — when present the backend uses it
|
|
110
|
+
* as last resort, after mtmd. Backends that have neither throw a
|
|
111
|
+
* structured `VisionBackendUnavailableError`.
|
|
112
|
+
*/
|
|
113
|
+
visionManager?: VisionManagerLike;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const DEFAULT_PROMPT = "Describe what is in this image.";
|
|
117
|
+
|
|
118
|
+
export async function loadCapacitorLlamaVisionBackend(
|
|
119
|
+
opts: CapacitorLlamaVisionBackendOptions,
|
|
120
|
+
): Promise<VisionDescribeBackend> {
|
|
121
|
+
const { loadArgs, mtmd, visionManager } = opts;
|
|
122
|
+
|
|
123
|
+
if (mtmd) {
|
|
124
|
+
// Validate mmproj presence here so we surface a clean error before
|
|
125
|
+
// burning a load (the binding's own error would be cryptic).
|
|
126
|
+
if (!existsSync(loadArgs.mmprojPath)) {
|
|
127
|
+
throw new VisionBackendUnavailableError(
|
|
128
|
+
"capacitor-llama",
|
|
129
|
+
"mmproj_missing",
|
|
130
|
+
`[vision/capacitor-llama] mmproj GGUF not found: ${loadArgs.mmprojPath}`,
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
const handle = await mtmd.loadVisionModel({
|
|
134
|
+
modelPath: loadArgs.modelPath,
|
|
135
|
+
mmprojPath: loadArgs.mmprojPath,
|
|
136
|
+
gpuLayers: loadArgs.gpuLayers,
|
|
137
|
+
contextSize: loadArgs.contextSize,
|
|
138
|
+
});
|
|
139
|
+
return {
|
|
140
|
+
id: "capacitor-llama",
|
|
141
|
+
async describe(
|
|
142
|
+
request: VisionDescribeRequest,
|
|
143
|
+
args?: VisionDescribeBackendOptions,
|
|
144
|
+
): Promise<VisionDescribeResult> {
|
|
145
|
+
const { bytes, mimeType } = resolveImageBytes(request.image);
|
|
146
|
+
const result = await handle.describeWithMmproj({
|
|
147
|
+
imageBytes: bytes,
|
|
148
|
+
mimeType,
|
|
149
|
+
prompt: request.prompt ?? DEFAULT_PROMPT,
|
|
150
|
+
maxTokens: request.maxTokens,
|
|
151
|
+
temperature: request.temperature,
|
|
152
|
+
signal: request.signal,
|
|
153
|
+
projectedTokens: args?.projectedTokens,
|
|
154
|
+
});
|
|
155
|
+
return shapeResult(result.text, {
|
|
156
|
+
projectorMs: result.projectorMs,
|
|
157
|
+
decodeMs: result.decodeMs,
|
|
158
|
+
cacheHit: Boolean(args?.projectedTokens),
|
|
159
|
+
});
|
|
160
|
+
},
|
|
161
|
+
async dispose() {
|
|
162
|
+
await handle.dispose();
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (visionManager) {
|
|
168
|
+
return {
|
|
169
|
+
id: "capacitor-llama",
|
|
170
|
+
async describe(
|
|
171
|
+
request: VisionDescribeRequest,
|
|
172
|
+
): Promise<VisionDescribeResult> {
|
|
173
|
+
const dataUrl = await imageInputToDataUrl(request.image);
|
|
174
|
+
const result = await visionManager.processImage(dataUrl);
|
|
175
|
+
return {
|
|
176
|
+
title: result.title,
|
|
177
|
+
description: result.description,
|
|
178
|
+
cacheHit: false,
|
|
179
|
+
};
|
|
180
|
+
},
|
|
181
|
+
async dispose() {
|
|
182
|
+
// VisionManager is a process-singleton owned by LocalAIManager;
|
|
183
|
+
// its lifetime is decoupled from the WS2 backend. Disposing the
|
|
184
|
+
// backend here is a no-op — the manager stays warm for legacy
|
|
185
|
+
// callers that haven't moved off LocalAIManager.describeImage yet.
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
throw new VisionBackendUnavailableError(
|
|
191
|
+
"capacitor-llama",
|
|
192
|
+
"binding_missing_mtmd",
|
|
193
|
+
"[vision/capacitor-llama] no mtmd binding and no VisionManager fallback was provided. Wire up the Capacitor-llama mtmd adapter (initMultimodal + media_paths completion) or pass a VisionManager fallback in options.",
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function shapeResult(
|
|
198
|
+
text: string,
|
|
199
|
+
telemetry: { projectorMs?: number; decodeMs?: number; cacheHit?: boolean },
|
|
200
|
+
): VisionDescribeResult {
|
|
201
|
+
const trimmed = text.trim();
|
|
202
|
+
if (!trimmed) {
|
|
203
|
+
throw new Error("[vision/capacitor-llama] backend returned empty text");
|
|
204
|
+
}
|
|
205
|
+
const title = trimmed.split(/[.!?]/, 1)[0]?.trim() || "Image";
|
|
206
|
+
return {
|
|
207
|
+
title,
|
|
208
|
+
description: trimmed,
|
|
209
|
+
...telemetry,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
async function imageInputToDataUrl(
|
|
214
|
+
input: VisionDescribeRequest["image"],
|
|
215
|
+
): Promise<string> {
|
|
216
|
+
switch (input.kind) {
|
|
217
|
+
case "dataUrl":
|
|
218
|
+
return input.dataUrl;
|
|
219
|
+
case "base64":
|
|
220
|
+
return `data:${input.mimeType ?? "image/png"};base64,${input.base64}`;
|
|
221
|
+
case "bytes": {
|
|
222
|
+
const mimeType = input.mimeType ?? "image/png";
|
|
223
|
+
const base64 = Buffer.from(input.bytes).toString("base64");
|
|
224
|
+
return `data:${mimeType};base64,${base64}`;
|
|
225
|
+
}
|
|
226
|
+
case "url": {
|
|
227
|
+
const url = input.url;
|
|
228
|
+
if (url.startsWith("data:")) return url;
|
|
229
|
+
if (url.startsWith("file://") || url.startsWith("/")) {
|
|
230
|
+
const filePath = url.startsWith("file://") ? url.slice(7) : url;
|
|
231
|
+
const bytes = await fs.readFile(filePath);
|
|
232
|
+
const mimeType = input.mimeType ?? guessMimeFromPath(filePath);
|
|
233
|
+
return `data:${mimeType};base64,${bytes.toString("base64")}`;
|
|
234
|
+
}
|
|
235
|
+
const res = await fetch(url);
|
|
236
|
+
if (!res.ok) {
|
|
237
|
+
throw new Error(
|
|
238
|
+
`[vision/capacitor-llama] failed to fetch image: ${res.status} ${res.statusText}`,
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
const buf = new Uint8Array(await res.arrayBuffer());
|
|
242
|
+
const mimeType =
|
|
243
|
+
input.mimeType ?? res.headers.get("content-type") ?? "image/png";
|
|
244
|
+
return `data:${mimeType};base64,${Buffer.from(buf).toString("base64")}`;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function guessMimeFromPath(p: string): string {
|
|
250
|
+
const lower = p.toLowerCase();
|
|
251
|
+
if (lower.endsWith(".jpg") || lower.endsWith(".jpeg")) return "image/jpeg";
|
|
252
|
+
if (lower.endsWith(".webp")) return "image/webp";
|
|
253
|
+
if (lower.endsWith(".gif")) return "image/gif";
|
|
254
|
+
return "image/png";
|
|
255
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Soft cloud fallback wrapper for local IMAGE_DESCRIPTION handlers.
|
|
3
|
+
*
|
|
4
|
+
* The local vision path can report recoverable unavailability without forcing
|
|
5
|
+
* callers to know which remote provider is paired. The wrapper keeps that
|
|
6
|
+
* state explicit: handlers return a normal image description or a typed
|
|
7
|
+
* fallback outcome that the next layer can handle.
|
|
8
|
+
*/
|
|
9
|
+
import type { ImageDescriptionParams, ImageDescriptionResult } from "@elizaos/core";
|
|
10
|
+
export type VisionFallbackReason = "local-unavailable" | "local-overloaded" | "local-error" | "local-aborted-pre-completion" | "local-not-registered" | "cloud-unavailable" | "cloud-error" | "vast-unavailable" | "vast-error";
|
|
11
|
+
export type LocalVisionOutcome = ImageDescriptionResult | string | {
|
|
12
|
+
kind: "ok";
|
|
13
|
+
result: ImageDescriptionResult | string;
|
|
14
|
+
} | {
|
|
15
|
+
kind: "fallback";
|
|
16
|
+
reason: VisionFallbackReason;
|
|
17
|
+
cause?: Error;
|
|
18
|
+
};
|
|
19
|
+
export type LocalVisionResult = Exclude<LocalVisionOutcome, {
|
|
20
|
+
kind: "fallback";
|
|
21
|
+
reason: VisionFallbackReason;
|
|
22
|
+
cause?: Error;
|
|
23
|
+
}>;
|
|
24
|
+
export type LocalImageDescriptionHandler = (params: ImageDescriptionParams | string) => Promise<LocalVisionOutcome>;
|
|
25
|
+
export type WrappedImageDescriptionHandler = LocalImageDescriptionHandler;
|
|
26
|
+
export interface VisionCloudFallbackOptions {
|
|
27
|
+
enabled?: boolean;
|
|
28
|
+
token?: string;
|
|
29
|
+
apiKey?: string;
|
|
30
|
+
baseUrl?: string;
|
|
31
|
+
fetch?: typeof fetch;
|
|
32
|
+
handler?: (params: ImageDescriptionParams | string, reason: VisionFallbackReason) => Promise<LocalVisionOutcome>;
|
|
33
|
+
log?: (message: string, detail?: Record<string, unknown>) => void;
|
|
34
|
+
}
|
|
35
|
+
export declare function classifyLocalVisionError(error: unknown): {
|
|
36
|
+
fallback: boolean;
|
|
37
|
+
reason: VisionFallbackReason;
|
|
38
|
+
cause?: Error;
|
|
39
|
+
};
|
|
40
|
+
export declare function isVisionFallbackOutcome(outcome: LocalVisionOutcome): outcome is {
|
|
41
|
+
kind: "fallback";
|
|
42
|
+
reason: VisionFallbackReason;
|
|
43
|
+
cause?: Error;
|
|
44
|
+
};
|
|
45
|
+
export declare function normalizeVisionDescription(result: LocalVisionResult): ImageDescriptionResult;
|
|
46
|
+
export declare function wrapImageDescriptionHandlerWithCloudFallback(local: LocalImageDescriptionHandler, options?: VisionCloudFallbackOptions): WrappedImageDescriptionHandler;
|
|
47
|
+
//# sourceMappingURL=cloud-fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-fallback.d.ts","sourceRoot":"","sources":["cloud-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACX,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,oBAAoB,GAC7B,mBAAmB,GACnB,kBAAkB,GAClB,aAAa,GACb,8BAA8B,GAC9B,sBAAsB,GACtB,mBAAmB,GACnB,aAAa,GACb,kBAAkB,GAClB,YAAY,CAAC;AAEhB,MAAM,MAAM,kBAAkB,GAC3B,sBAAsB,GACtB,MAAM,GACN;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,iBAAiB,GAAG,OAAO,CACtC,kBAAkB,EAClB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CACjE,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG,CAC1C,MAAM,EAAE,sBAAsB,GAAG,MAAM,KACnC,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEjC,MAAM,MAAM,8BAA8B,GAAG,4BAA4B,CAAC;AAE1E,MAAM,WAAW,0BAA0B;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,CACT,MAAM,EAAE,sBAAsB,GAAG,MAAM,EACvC,MAAM,EAAE,oBAAoB,KACxB,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAClE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG;IACzD,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,KAAK,CAAC,EAAE,KAAK,CAAC;CACd,CA2CA;AAED,wBAAgB,uBAAuB,CACtC,OAAO,EAAE,kBAAkB,GACzB,OAAO,IAAI;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,KAAK,CAAC,EAAE,KAAK,CAAC;CACd,CAOA;AAED,wBAAgB,0BAA0B,CACzC,MAAM,EAAE,iBAAiB,GACvB,sBAAsB,CAiCxB;AAqED,wBAAgB,4CAA4C,CAC3D,KAAK,EAAE,4BAA4B,EACnC,OAAO,GAAE,0BAA+B,GACtC,8BAA8B,CAyChC"}
|