@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,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image-gen backend-pick logic (WS3).
|
|
3
|
+
*
|
|
4
|
+
* Given a runtime platform + accelerator hint, return the ordered list
|
|
5
|
+
* of backend ids to try. The arbiter walks this list at load time and
|
|
6
|
+
* stops at the first backend that resolves to a live handle. A backend
|
|
7
|
+
* that throws `ImageGenBackendUnavailableError` lets the selector fall
|
|
8
|
+
* through to the next.
|
|
9
|
+
*
|
|
10
|
+
* Per-platform policy:
|
|
11
|
+
*
|
|
12
|
+
* - **macOS Apple Silicon**: `mflux` (MLX) → `sd-cpp` (CPU fallback).
|
|
13
|
+
* mflux is Metal-accelerated through MLX; sd-cpp-CPU is the
|
|
14
|
+
* functional last-resort if the venv isn't installed.
|
|
15
|
+
* - **macOS Intel**: `sd-cpp` (Metal/CPU). MLX requires Apple Silicon;
|
|
16
|
+
* mflux is skipped on Intel Macs.
|
|
17
|
+
* - **iOS**: `coreml` only. There is no sd-cpp on iOS — Core ML is
|
|
18
|
+
* the only sanctioned acceleration path.
|
|
19
|
+
* - **Linux + NVIDIA**: `sd-cpp` CUDA only when the sd-cpp probe,
|
|
20
|
+
* binary manifest, help, or version output proves CUDA support.
|
|
21
|
+
* Otherwise use `sd-cpp` CPU and let the loader emit an explicit
|
|
22
|
+
* CUDA-missing fallback error if CUDA was requested elsewhere.
|
|
23
|
+
* - **Linux + AMD/Intel**: `sd-cpp --vulkan` → `sd-cpp` (CPU fallback).
|
|
24
|
+
* - **Linux + CPU**: `sd-cpp` (CPU).
|
|
25
|
+
* - **Windows + NVIDIA**: `tensorrt` → `sd-cpp` (CUDA) → `sd-cpp` (CPU).
|
|
26
|
+
* - **Windows + AMD/Intel**: `sd-cpp --vulkan` → `sd-cpp` (CPU).
|
|
27
|
+
* - **Android (AOSP)**: `aosp` (libeliza-llama-shim with Vulkan/OpenCL,
|
|
28
|
+
* handled by `plugin-aosp-local-inference`). No second backend on
|
|
29
|
+
* mobile — falling back to CPU sd-cpp on a phone is too slow to be
|
|
30
|
+
* useful and would just block the UI.
|
|
31
|
+
*
|
|
32
|
+
* The selector intentionally does NOT account for tier or model
|
|
33
|
+
* compatibility — that's the catalog's job. A 27B-tier user on a
|
|
34
|
+
* Vulkan-only Linux box doesn't change the selector; it just changes
|
|
35
|
+
* which model the chosen backend loads.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
import type { ImageGenBackend } from "./types";
|
|
39
|
+
|
|
40
|
+
/** Per-platform runtime fingerprint the selector consumes. */
|
|
41
|
+
export interface ImageGenRuntimeProfile {
|
|
42
|
+
/** Node-style `process.platform`: `"linux" | "darwin" | "win32" | "android"`. */
|
|
43
|
+
platform: NodeJS.Platform | "android" | "ios";
|
|
44
|
+
/**
|
|
45
|
+
* `process.arch` (`"x64"` | `"arm64"`). Apple Silicon = `"arm64"` on
|
|
46
|
+
* `"darwin"`. Intel Mac = `"x64"` on `"darwin"`.
|
|
47
|
+
*/
|
|
48
|
+
arch: NodeJS.Architecture | string;
|
|
49
|
+
/**
|
|
50
|
+
* GPU vendor hint, when detected. `"nvidia"` enables CUDA / TensorRT
|
|
51
|
+
* paths; `"amd"` and `"intel"` favour Vulkan. `"apple"` is implied by
|
|
52
|
+
* platform=darwin+arch=arm64.
|
|
53
|
+
*/
|
|
54
|
+
gpu?: "nvidia" | "amd" | "intel" | "apple" | "none";
|
|
55
|
+
/**
|
|
56
|
+
* sd-cpp binary capability evidence gathered from the first-run probe,
|
|
57
|
+
* bundle manifest, or a loader-side help/version check. GPU vendor alone
|
|
58
|
+
* is not evidence that the installed `sd` binary was built with CUDA.
|
|
59
|
+
*/
|
|
60
|
+
sdCpp?: {
|
|
61
|
+
accelerators?: readonly string[];
|
|
62
|
+
cudaCapable?: boolean;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Explicit accelerator requirement for release verification and operator
|
|
66
|
+
* smoke tests. When set, the selector returns only backends that can
|
|
67
|
+
* satisfy that accelerator, so CUDA/Vulkan evidence cannot be produced by
|
|
68
|
+
* silently falling through to CPU.
|
|
69
|
+
*/
|
|
70
|
+
requiredAccelerator?:
|
|
71
|
+
| "cpu"
|
|
72
|
+
| "cuda"
|
|
73
|
+
| "vulkan"
|
|
74
|
+
| "metal"
|
|
75
|
+
| "coreml"
|
|
76
|
+
| "tensorrt";
|
|
77
|
+
/**
|
|
78
|
+
* True when running inside the iOS Capacitor shell. We can't infer
|
|
79
|
+
* from `process.platform` alone because Capacitor reports `"ios"`
|
|
80
|
+
* but Node's typings only know `darwin`/`linux`/etc.
|
|
81
|
+
*/
|
|
82
|
+
isIos?: boolean;
|
|
83
|
+
/**
|
|
84
|
+
* True when running inside the Android Capacitor / `plugin-aosp-local-inference`
|
|
85
|
+
* shell. Node reports `"linux"` on AOSP, so we need an explicit signal.
|
|
86
|
+
*/
|
|
87
|
+
isAndroid?: boolean;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export type ImageGenBackendId = ImageGenBackend["id"];
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Ordered list of `(backendId, accelerator)` pairs to try. The caller
|
|
94
|
+
* picks the first one whose backend loader returns a live handle.
|
|
95
|
+
*
|
|
96
|
+
* Accelerator strings match `ImageGenLoadArgs.accelerator`.
|
|
97
|
+
*/
|
|
98
|
+
export interface ImageGenBackendChoice {
|
|
99
|
+
backendId: ImageGenBackendId;
|
|
100
|
+
accelerator?:
|
|
101
|
+
| "auto"
|
|
102
|
+
| "cpu"
|
|
103
|
+
| "cuda"
|
|
104
|
+
| "vulkan"
|
|
105
|
+
| "metal"
|
|
106
|
+
| "coreml"
|
|
107
|
+
| "tensorrt";
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function selectImageGenBackends(
|
|
111
|
+
profile: ImageGenRuntimeProfile,
|
|
112
|
+
): readonly ImageGenBackendChoice[] {
|
|
113
|
+
if (profile.requiredAccelerator) {
|
|
114
|
+
switch (profile.requiredAccelerator) {
|
|
115
|
+
case "coreml":
|
|
116
|
+
return [{ backendId: "coreml", accelerator: "coreml" }];
|
|
117
|
+
case "tensorrt":
|
|
118
|
+
return [{ backendId: "tensorrt", accelerator: "tensorrt" }];
|
|
119
|
+
case "metal":
|
|
120
|
+
return profile.platform === "darwin" && profile.arch === "arm64"
|
|
121
|
+
? [{ backendId: "mflux", accelerator: "metal" }]
|
|
122
|
+
: [{ backendId: "sd-cpp", accelerator: "metal" }];
|
|
123
|
+
case "cuda":
|
|
124
|
+
return [{ backendId: "sd-cpp", accelerator: "cuda" }];
|
|
125
|
+
case "vulkan":
|
|
126
|
+
return [{ backendId: "sd-cpp", accelerator: "vulkan" }];
|
|
127
|
+
case "cpu":
|
|
128
|
+
return [{ backendId: "sd-cpp", accelerator: "cpu" }];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (profile.isIos) {
|
|
132
|
+
// iOS Capacitor: Core ML only. No fallback — sd-cpp is not
|
|
133
|
+
// shipped on iOS and falling back to nothing surfaces a clean
|
|
134
|
+
// "unavailable on this device" error in the UI.
|
|
135
|
+
return [{ backendId: "coreml", accelerator: "coreml" }];
|
|
136
|
+
}
|
|
137
|
+
if (profile.isAndroid) {
|
|
138
|
+
// AOSP: libeliza-llama-shim with Vulkan/OpenCL. The JNI handles
|
|
139
|
+
// the acceleration path; from the JS side we just request "auto"
|
|
140
|
+
// and let the shim pick.
|
|
141
|
+
return [{ backendId: "aosp", accelerator: "auto" }];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (profile.platform === "darwin") {
|
|
145
|
+
if (profile.arch === "arm64") {
|
|
146
|
+
// Apple Silicon: mflux (MLX/Metal) first; sd-cpp CPU as
|
|
147
|
+
// last resort if the venv isn't installed.
|
|
148
|
+
return [
|
|
149
|
+
{ backendId: "mflux", accelerator: "metal" },
|
|
150
|
+
{ backendId: "sd-cpp", accelerator: "cpu" },
|
|
151
|
+
];
|
|
152
|
+
}
|
|
153
|
+
// Intel Mac. mflux requires Apple Silicon; sd-cpp Metal is the
|
|
154
|
+
// reasonable fast path. Builds for Intel Mac sd-cpp are sparse;
|
|
155
|
+
// CPU is the safe default.
|
|
156
|
+
return [
|
|
157
|
+
{ backendId: "sd-cpp", accelerator: "auto" },
|
|
158
|
+
{ backendId: "sd-cpp", accelerator: "cpu" },
|
|
159
|
+
];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (profile.platform === "win32") {
|
|
163
|
+
if (profile.gpu === "nvidia") {
|
|
164
|
+
return [
|
|
165
|
+
{ backendId: "tensorrt", accelerator: "tensorrt" },
|
|
166
|
+
{ backendId: "sd-cpp", accelerator: "cuda" },
|
|
167
|
+
{ backendId: "sd-cpp", accelerator: "cpu" },
|
|
168
|
+
];
|
|
169
|
+
}
|
|
170
|
+
if (profile.gpu === "amd" || profile.gpu === "intel") {
|
|
171
|
+
return [
|
|
172
|
+
{ backendId: "sd-cpp", accelerator: "vulkan" },
|
|
173
|
+
{ backendId: "sd-cpp", accelerator: "cpu" },
|
|
174
|
+
];
|
|
175
|
+
}
|
|
176
|
+
return [{ backendId: "sd-cpp", accelerator: "cpu" }];
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Linux (and any other Unix the runtime reports). sd-cpp covers
|
|
180
|
+
// CUDA, Vulkan, and CPU through the same binary; we just pick the
|
|
181
|
+
// accelerator order.
|
|
182
|
+
if (profile.platform === "linux") {
|
|
183
|
+
if (profile.gpu === "nvidia") {
|
|
184
|
+
const sdCppCudaCapable =
|
|
185
|
+
profile.sdCpp?.cudaCapable === true ||
|
|
186
|
+
profile.sdCpp?.accelerators?.includes("cuda") === true;
|
|
187
|
+
return sdCppCudaCapable
|
|
188
|
+
? [
|
|
189
|
+
{ backendId: "sd-cpp", accelerator: "cuda" },
|
|
190
|
+
{ backendId: "sd-cpp", accelerator: "cpu" },
|
|
191
|
+
]
|
|
192
|
+
: [{ backendId: "sd-cpp", accelerator: "cpu" }];
|
|
193
|
+
}
|
|
194
|
+
if (profile.gpu === "amd" || profile.gpu === "intel") {
|
|
195
|
+
return [
|
|
196
|
+
{ backendId: "sd-cpp", accelerator: "vulkan" },
|
|
197
|
+
{ backendId: "sd-cpp", accelerator: "cpu" },
|
|
198
|
+
];
|
|
199
|
+
}
|
|
200
|
+
return [{ backendId: "sd-cpp", accelerator: "cpu" }];
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Unknown platform — try sd-cpp CPU and fail cleanly if it isn't
|
|
204
|
+
// installed.
|
|
205
|
+
return [{ backendId: "sd-cpp", accelerator: "cpu" }];
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Tier → default image-gen model id. Mirrors
|
|
210
|
+
* `eliza/packages/chip/ELIZA_1_BUNDLE_EXTRAS.json` and the WS10 golden test's
|
|
211
|
+
* `PER_TIER_DEFAULT` map. Used by the WS3 capability registration to
|
|
212
|
+
* resolve the catalog's bare tier id into a concrete diffusion file.
|
|
213
|
+
*/
|
|
214
|
+
export const TIER_TO_DEFAULT_IMAGE_MODEL: Readonly<
|
|
215
|
+
Record<
|
|
216
|
+
string,
|
|
217
|
+
{
|
|
218
|
+
modelId: string;
|
|
219
|
+
file: string;
|
|
220
|
+
splitDiffusionModel?: boolean;
|
|
221
|
+
vae?: string;
|
|
222
|
+
llm?: string;
|
|
223
|
+
}
|
|
224
|
+
>
|
|
225
|
+
> = {
|
|
226
|
+
"eliza-1-2b": {
|
|
227
|
+
modelId: "imagegen-sd-1_5-q5_0",
|
|
228
|
+
file: "imagegen/sd-1.5-Q5_0.gguf",
|
|
229
|
+
},
|
|
230
|
+
"eliza-1-4b": {
|
|
231
|
+
modelId: "imagegen-sd-1_5-q5_0",
|
|
232
|
+
file: "imagegen/sd-1.5-Q5_0.gguf",
|
|
233
|
+
},
|
|
234
|
+
"eliza-1-9b": {
|
|
235
|
+
modelId: "imagegen-z-image-turbo-q4_k_m",
|
|
236
|
+
file: "imagegen/z-image-turbo-Q4_K_M.gguf",
|
|
237
|
+
splitDiffusionModel: true,
|
|
238
|
+
vae: "imagegen/vae/ae.safetensors",
|
|
239
|
+
llm: "imagegen/text-encoders/Qwen3-4B-Instruct-2507-Q4_K_M.gguf",
|
|
240
|
+
},
|
|
241
|
+
"eliza-1-27b": {
|
|
242
|
+
modelId: "imagegen-z-image-turbo-q4_k_m",
|
|
243
|
+
file: "imagegen/z-image-turbo-Q4_K_M.gguf",
|
|
244
|
+
splitDiffusionModel: true,
|
|
245
|
+
vae: "imagegen/vae/ae.safetensors",
|
|
246
|
+
llm: "imagegen/text-encoders/Qwen3-4B-Instruct-2507-Q4_K_M.gguf",
|
|
247
|
+
},
|
|
248
|
+
"eliza-1-27b-256k": {
|
|
249
|
+
modelId: "imagegen-z-image-turbo-q4_k_m",
|
|
250
|
+
file: "imagegen/z-image-turbo-Q4_K_M.gguf",
|
|
251
|
+
splitDiffusionModel: true,
|
|
252
|
+
vae: "imagegen/vae/ae.safetensors",
|
|
253
|
+
llm: "imagegen/text-encoders/Qwen3-4B-Instruct-2507-Q4_K_M.gguf",
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Resolve a tier id (or raw model id) to its default image-gen model.
|
|
259
|
+
* Returns null when the input doesn't match any known tier — caller
|
|
260
|
+
* surfaces a clear error.
|
|
261
|
+
*/
|
|
262
|
+
export function resolveDefaultImageGenModel(keyOrTier: string): {
|
|
263
|
+
modelId: string;
|
|
264
|
+
file: string;
|
|
265
|
+
splitDiffusionModel?: boolean;
|
|
266
|
+
vae?: string;
|
|
267
|
+
llm?: string;
|
|
268
|
+
} | null {
|
|
269
|
+
const direct = TIER_TO_DEFAULT_IMAGE_MODEL[keyOrTier];
|
|
270
|
+
if (direct) return direct;
|
|
271
|
+
// Allow callers to pass the bare model id straight through; if it
|
|
272
|
+
// matches a known model file in the per-tier map we echo it back.
|
|
273
|
+
for (const entry of Object.values(TIER_TO_DEFAULT_IMAGE_MODEL)) {
|
|
274
|
+
if (entry.modelId === keyOrTier) return entry;
|
|
275
|
+
}
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core ML image-gen backend contract (WS3) — iOS via Capacitor bridge.
|
|
3
|
+
*
|
|
4
|
+
* The contract for the Swift side. The real implementation lives in
|
|
5
|
+
* `eliza/packages/app-core/platforms/ios/App/App/ImageGenBridge.swift`
|
|
6
|
+
* (skeleton written under `// MARK: - Contract`). At runtime the iOS
|
|
7
|
+
* plugin (`@elizaos/plugin-ios-local-inference`) registers a Capacitor
|
|
8
|
+
* service that exposes:
|
|
9
|
+
*
|
|
10
|
+
* await Capacitor.Plugins.ElizaImageGen.generateImage({
|
|
11
|
+
* modelKey: "imagegen-coreml-sd-1_5",
|
|
12
|
+
* prompt: "<text>",
|
|
13
|
+
* negativePrompt: "<text>", // optional
|
|
14
|
+
* width: 512,
|
|
15
|
+
* height: 512,
|
|
16
|
+
* steps: 20,
|
|
17
|
+
* guidanceScale: 7.5,
|
|
18
|
+
* seed: 42 // -1 = random
|
|
19
|
+
* })
|
|
20
|
+
* -> { png: "<base64>", seed: number, inferenceTimeMs: number }
|
|
21
|
+
*
|
|
22
|
+
* Swift side uses `apple/ml-stable-diffusion` Swift package directly;
|
|
23
|
+
* the `.mlpackage` directories are dropped into the app's Documents
|
|
24
|
+
* folder by the bundle installer.
|
|
25
|
+
*
|
|
26
|
+
* Until the Swift bridge is present and the Capacitor plugin exposes the
|
|
27
|
+
* binding, `loadCoreMlImageGenBackend` throws a structured
|
|
28
|
+
* `ImageGenBackendUnavailableError` so the selector can fall through
|
|
29
|
+
* — but on iOS there is no fall-through (sd-cpp doesn't run on iOS,
|
|
30
|
+
* mflux is macOS-only). A `coreml_unavailable` error there means
|
|
31
|
+
* "this device does not support image-gen yet."
|
|
32
|
+
*
|
|
33
|
+
* Publishing pipeline (iOS 17+ / iOS 26+):
|
|
34
|
+
*
|
|
35
|
+
* Build (.mlpackage per tier):
|
|
36
|
+
* git clone https://github.com/apple/ml-stable-diffusion && cd ml-stable-diffusion
|
|
37
|
+
* python3 -m venv venv && ./venv/bin/pip install -e .
|
|
38
|
+
* # SD 1.5 — 512x512, attention=SPLIT_EINSUM_V2 for ANE on iPhone 15+
|
|
39
|
+
* ./venv/bin/python -m python_coreml_stable_diffusion.torch2coreml \
|
|
40
|
+
* --convert-unet --convert-vae-encoder --convert-vae-decoder \
|
|
41
|
+
* --convert-text-encoder --bundle-resources-for-swift-cli \
|
|
42
|
+
* --attention-implementation SPLIT_EINSUM_V2 \
|
|
43
|
+
* --model-version runwayml/stable-diffusion-v1-5 \
|
|
44
|
+
* --output-dir build/sd-1.5-coreml-512
|
|
45
|
+
* # SDXL — 1024x1024, same pipeline at --model-version
|
|
46
|
+
* # stabilityai/sdxl-turbo for the iPhone 16 Pro / iPad M-class path.
|
|
47
|
+
* xcrun coremlc compile build/sd-1.5-coreml-512 build/sd-1.5-coreml-512-compiled
|
|
48
|
+
* Sign:
|
|
49
|
+
* codesign --force --options runtime --timestamp \
|
|
50
|
+
* --sign "Apple Distribution: Eliza Labs Inc." \
|
|
51
|
+
* build/sd-1.5-coreml-512/*.mlpackage
|
|
52
|
+
* Drop (into the Capacitor app bundle's on-demand resources):
|
|
53
|
+
* Tag with `nameOfResourcesODR=ImageGenSD15` so the App Store delivers
|
|
54
|
+
* the package only when the runtime requests it via `NSBundleResource
|
|
55
|
+
* Request`. Total compressed .mlpackage size is ~600 MB for SD 1.5
|
|
56
|
+
* at SPLIT_EINSUM_V2 and ~3 GB for SDXL-turbo.
|
|
57
|
+
* Notarize / submit:
|
|
58
|
+
* The .mlpackages ship inside the signed IPA; notarization is the
|
|
59
|
+
* standard `altool notarytool submit` step for the host IPA.
|
|
60
|
+
* iOS 26 (forward-compat note):
|
|
61
|
+
* iOS 26 adds the public `MLTensor` API and an updated ANE driver;
|
|
62
|
+
* re-build the .mlpackage with `--attention-implementation
|
|
63
|
+
* SPLIT_EINSUM_V2` on the iOS 26 SDK to pick up the latest ANE
|
|
64
|
+
* scheduling improvements. The Swift bridge code in
|
|
65
|
+
* `ImageGenBridge.swift` is the same across iOS 17/18/26.
|
|
66
|
+
*/
|
|
67
|
+
import type { ImageGenBackend, ImageGenLoadArgs } from "./types";
|
|
68
|
+
/**
|
|
69
|
+
* The Capacitor bridge shape. The iOS plugin registers an instance
|
|
70
|
+
* under the runtime service name `"capacitor-image-gen"` once the
|
|
71
|
+
* Swift side ships.
|
|
72
|
+
*/
|
|
73
|
+
export interface CoreMlImageGenBridge {
|
|
74
|
+
/**
|
|
75
|
+
* True when the Swift `ImageGenBridge.swift` is present AND a
|
|
76
|
+
* `.mlpackage` has been resolved for the active tier. False when
|
|
77
|
+
* either is missing — the backend throws on `generate` in
|
|
78
|
+
* that case rather than producing a synthetic PNG.
|
|
79
|
+
*/
|
|
80
|
+
isAvailable(): boolean;
|
|
81
|
+
generateImage(args: {
|
|
82
|
+
modelKey: string;
|
|
83
|
+
prompt: string;
|
|
84
|
+
negativePrompt?: string;
|
|
85
|
+
width: number;
|
|
86
|
+
height: number;
|
|
87
|
+
steps: number;
|
|
88
|
+
guidanceScale: number;
|
|
89
|
+
seed: number;
|
|
90
|
+
signal?: AbortSignal;
|
|
91
|
+
}): Promise<{
|
|
92
|
+
/** Base64-encoded PNG. */
|
|
93
|
+
png: string;
|
|
94
|
+
seed: number;
|
|
95
|
+
inferenceTimeMs: number;
|
|
96
|
+
}>;
|
|
97
|
+
}
|
|
98
|
+
export interface LoadCoreMlImageGenBackendOptions {
|
|
99
|
+
loadArgs: ImageGenLoadArgs;
|
|
100
|
+
modelKey: string;
|
|
101
|
+
bridge?: CoreMlImageGenBridge;
|
|
102
|
+
now?: () => number;
|
|
103
|
+
}
|
|
104
|
+
export declare function loadCoreMlImageGenBackend(opts: LoadCoreMlImageGenBackendOptions): Promise<ImageGenBackend>;
|
|
105
|
+
//# sourceMappingURL=coreml-unavailable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coreml-unavailable.d.ts","sourceRoot":"","sources":["coreml-unavailable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AAIH,OAAO,KAAK,EACX,eAAe,EACf,gBAAgB,EAGhB,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACpC;;;;;OAKG;IACH,WAAW,IAAI,OAAO,CAAC;IACvB,aAAa,CAAC,IAAI,EAAE;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,WAAW,CAAC;KACrB,GAAG,OAAO,CAAC;QACX,0BAA0B;QAC1B,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,eAAe,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;CACH;AAED,MAAM,WAAW,gCAAgC;IAChD,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAED,wBAAsB,yBAAyB,CAC9C,IAAI,EAAE,gCAAgC,GACpC,OAAO,CAAC,eAAe,CAAC,CA4F1B"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core ML image-gen backend contract (WS3) — iOS via Capacitor bridge.
|
|
3
|
+
*
|
|
4
|
+
* The contract for the Swift side. The real implementation lives in
|
|
5
|
+
* `eliza/packages/app-core/platforms/ios/App/App/ImageGenBridge.swift`
|
|
6
|
+
* (skeleton written under `// MARK: - Contract`). At runtime the iOS
|
|
7
|
+
* plugin (`@elizaos/plugin-ios-local-inference`) registers a Capacitor
|
|
8
|
+
* service that exposes:
|
|
9
|
+
*
|
|
10
|
+
* await Capacitor.Plugins.ElizaImageGen.generateImage({
|
|
11
|
+
* modelKey: "imagegen-coreml-sd-1_5",
|
|
12
|
+
* prompt: "<text>",
|
|
13
|
+
* negativePrompt: "<text>", // optional
|
|
14
|
+
* width: 512,
|
|
15
|
+
* height: 512,
|
|
16
|
+
* steps: 20,
|
|
17
|
+
* guidanceScale: 7.5,
|
|
18
|
+
* seed: 42 // -1 = random
|
|
19
|
+
* })
|
|
20
|
+
* -> { png: "<base64>", seed: number, inferenceTimeMs: number }
|
|
21
|
+
*
|
|
22
|
+
* Swift side uses `apple/ml-stable-diffusion` Swift package directly;
|
|
23
|
+
* the `.mlpackage` directories are dropped into the app's Documents
|
|
24
|
+
* folder by the bundle installer.
|
|
25
|
+
*
|
|
26
|
+
* Until the Swift bridge is present and the Capacitor plugin exposes the
|
|
27
|
+
* binding, `loadCoreMlImageGenBackend` throws a structured
|
|
28
|
+
* `ImageGenBackendUnavailableError` so the selector can fall through
|
|
29
|
+
* — but on iOS there is no fall-through (sd-cpp doesn't run on iOS,
|
|
30
|
+
* mflux is macOS-only). A `coreml_unavailable` error there means
|
|
31
|
+
* "this device does not support image-gen yet."
|
|
32
|
+
*
|
|
33
|
+
* Publishing pipeline (iOS 17+ / iOS 26+):
|
|
34
|
+
*
|
|
35
|
+
* Build (.mlpackage per tier):
|
|
36
|
+
* git clone https://github.com/apple/ml-stable-diffusion && cd ml-stable-diffusion
|
|
37
|
+
* python3 -m venv venv && ./venv/bin/pip install -e .
|
|
38
|
+
* # SD 1.5 — 512x512, attention=SPLIT_EINSUM_V2 for ANE on iPhone 15+
|
|
39
|
+
* ./venv/bin/python -m python_coreml_stable_diffusion.torch2coreml \
|
|
40
|
+
* --convert-unet --convert-vae-encoder --convert-vae-decoder \
|
|
41
|
+
* --convert-text-encoder --bundle-resources-for-swift-cli \
|
|
42
|
+
* --attention-implementation SPLIT_EINSUM_V2 \
|
|
43
|
+
* --model-version runwayml/stable-diffusion-v1-5 \
|
|
44
|
+
* --output-dir build/sd-1.5-coreml-512
|
|
45
|
+
* # SDXL — 1024x1024, same pipeline at --model-version
|
|
46
|
+
* # stabilityai/sdxl-turbo for the iPhone 16 Pro / iPad M-class path.
|
|
47
|
+
* xcrun coremlc compile build/sd-1.5-coreml-512 build/sd-1.5-coreml-512-compiled
|
|
48
|
+
* Sign:
|
|
49
|
+
* codesign --force --options runtime --timestamp \
|
|
50
|
+
* --sign "Apple Distribution: Eliza Labs Inc." \
|
|
51
|
+
* build/sd-1.5-coreml-512/*.mlpackage
|
|
52
|
+
* Drop (into the Capacitor app bundle's on-demand resources):
|
|
53
|
+
* Tag with `nameOfResourcesODR=ImageGenSD15` so the App Store delivers
|
|
54
|
+
* the package only when the runtime requests it via `NSBundleResource
|
|
55
|
+
* Request`. Total compressed .mlpackage size is ~600 MB for SD 1.5
|
|
56
|
+
* at SPLIT_EINSUM_V2 and ~3 GB for SDXL-turbo.
|
|
57
|
+
* Notarize / submit:
|
|
58
|
+
* The .mlpackages ship inside the signed IPA; notarization is the
|
|
59
|
+
* standard `altool notarytool submit` step for the host IPA.
|
|
60
|
+
* iOS 26 (forward-compat note):
|
|
61
|
+
* iOS 26 adds the public `MLTensor` API and an updated ANE driver;
|
|
62
|
+
* re-build the .mlpackage with `--attention-implementation
|
|
63
|
+
* SPLIT_EINSUM_V2` on the iOS 26 SDK to pick up the latest ANE
|
|
64
|
+
* scheduling improvements. The Swift bridge code in
|
|
65
|
+
* `ImageGenBridge.swift` is the same across iOS 17/18/26.
|
|
66
|
+
*/
|
|
67
|
+
|
|
68
|
+
import { ImageGenBackendUnavailableError } from "./errors";
|
|
69
|
+
import { PNG_SIGNATURE, resolveSeed } from "./sd-cpp";
|
|
70
|
+
import type {
|
|
71
|
+
ImageGenBackend,
|
|
72
|
+
ImageGenLoadArgs,
|
|
73
|
+
ImageGenRequest,
|
|
74
|
+
ImageGenResult,
|
|
75
|
+
} from "./types";
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* The Capacitor bridge shape. The iOS plugin registers an instance
|
|
79
|
+
* under the runtime service name `"capacitor-image-gen"` once the
|
|
80
|
+
* Swift side ships.
|
|
81
|
+
*/
|
|
82
|
+
export interface CoreMlImageGenBridge {
|
|
83
|
+
/**
|
|
84
|
+
* True when the Swift `ImageGenBridge.swift` is present AND a
|
|
85
|
+
* `.mlpackage` has been resolved for the active tier. False when
|
|
86
|
+
* either is missing — the backend throws on `generate` in
|
|
87
|
+
* that case rather than producing a synthetic PNG.
|
|
88
|
+
*/
|
|
89
|
+
isAvailable(): boolean;
|
|
90
|
+
generateImage(args: {
|
|
91
|
+
modelKey: string;
|
|
92
|
+
prompt: string;
|
|
93
|
+
negativePrompt?: string;
|
|
94
|
+
width: number;
|
|
95
|
+
height: number;
|
|
96
|
+
steps: number;
|
|
97
|
+
guidanceScale: number;
|
|
98
|
+
seed: number;
|
|
99
|
+
signal?: AbortSignal;
|
|
100
|
+
}): Promise<{
|
|
101
|
+
/** Base64-encoded PNG. */
|
|
102
|
+
png: string;
|
|
103
|
+
seed: number;
|
|
104
|
+
inferenceTimeMs: number;
|
|
105
|
+
}>;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export interface LoadCoreMlImageGenBackendOptions {
|
|
109
|
+
loadArgs: ImageGenLoadArgs;
|
|
110
|
+
modelKey: string;
|
|
111
|
+
bridge?: CoreMlImageGenBridge;
|
|
112
|
+
now?: () => number;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export async function loadCoreMlImageGenBackend(
|
|
116
|
+
opts: LoadCoreMlImageGenBackendOptions,
|
|
117
|
+
): Promise<ImageGenBackend> {
|
|
118
|
+
const { bridge, modelKey } = opts;
|
|
119
|
+
const now = opts.now ?? Date.now;
|
|
120
|
+
|
|
121
|
+
if (!bridge?.isAvailable()) {
|
|
122
|
+
throw new ImageGenBackendUnavailableError(
|
|
123
|
+
"coreml",
|
|
124
|
+
"binding_unavailable",
|
|
125
|
+
"[imagegen/coreml] Capacitor ElizaImageGen plugin is not available. Wire ImageGenBridge.swift to apple/ml-stable-diffusion and ship a tier-matched .mlpackage. Until then, iOS image-gen is unavailable.",
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
let disposed = false;
|
|
130
|
+
|
|
131
|
+
return {
|
|
132
|
+
id: "coreml",
|
|
133
|
+
supports(req: ImageGenRequest) {
|
|
134
|
+
if (disposed) return false;
|
|
135
|
+
// Core ML compiles to a fixed input shape per `.mlpackage`.
|
|
136
|
+
// SD 1.5 stock packages target 512×512; SDXL packages target
|
|
137
|
+
// 1024×1024. We accept the catalog defaults; explicit asks
|
|
138
|
+
// outside the package's shape are rejected so the caller can
|
|
139
|
+
// see a clear error rather than the runtime cropping/upsampling.
|
|
140
|
+
const w = req.width ?? 512;
|
|
141
|
+
const h = req.height ?? 512;
|
|
142
|
+
if (w !== 512 && w !== 768 && w !== 1024) return false;
|
|
143
|
+
if (h !== 512 && h !== 768 && h !== 1024) return false;
|
|
144
|
+
return true;
|
|
145
|
+
},
|
|
146
|
+
async generate(req: ImageGenRequest): Promise<ImageGenResult> {
|
|
147
|
+
if (disposed) {
|
|
148
|
+
throw new ImageGenBackendUnavailableError(
|
|
149
|
+
"coreml",
|
|
150
|
+
"binding_unavailable",
|
|
151
|
+
"[imagegen/coreml] generate called after dispose()",
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
if (!req.prompt.trim()) {
|
|
155
|
+
throw new ImageGenBackendUnavailableError(
|
|
156
|
+
"coreml",
|
|
157
|
+
"unsupported_request",
|
|
158
|
+
"[imagegen/coreml] prompt is empty",
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
const seed = resolveSeed(req.seed);
|
|
162
|
+
const width = req.width ?? 512;
|
|
163
|
+
const height = req.height ?? 512;
|
|
164
|
+
const steps = req.steps ?? 20;
|
|
165
|
+
const guidanceScale = req.guidanceScale ?? 7.5;
|
|
166
|
+
const startMs = now();
|
|
167
|
+
const result = await bridge.generateImage({
|
|
168
|
+
modelKey,
|
|
169
|
+
prompt: req.prompt,
|
|
170
|
+
negativePrompt: req.negativePrompt,
|
|
171
|
+
width,
|
|
172
|
+
height,
|
|
173
|
+
steps,
|
|
174
|
+
guidanceScale,
|
|
175
|
+
seed,
|
|
176
|
+
signal: req.signal,
|
|
177
|
+
});
|
|
178
|
+
const elapsed =
|
|
179
|
+
typeof result.inferenceTimeMs === "number" && result.inferenceTimeMs > 0
|
|
180
|
+
? result.inferenceTimeMs
|
|
181
|
+
: Math.max(1, now() - startMs);
|
|
182
|
+
const bytes = decodeBase64Png(result.png);
|
|
183
|
+
// Core ML batch path doesn't surface per-step progress; emit a
|
|
184
|
+
// single completion event when the caller asked for one.
|
|
185
|
+
if (req.onProgressChunk) {
|
|
186
|
+
req.onProgressChunk({ step: steps, total: steps });
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
image: bytes,
|
|
190
|
+
mime: "image/png",
|
|
191
|
+
seed: typeof result.seed === "number" ? result.seed : seed,
|
|
192
|
+
metadata: {
|
|
193
|
+
model: modelKey,
|
|
194
|
+
prompt: req.prompt,
|
|
195
|
+
steps,
|
|
196
|
+
guidanceScale,
|
|
197
|
+
inferenceTimeMs: elapsed,
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
},
|
|
201
|
+
async dispose() {
|
|
202
|
+
if (disposed) return;
|
|
203
|
+
disposed = true;
|
|
204
|
+
// Capacitor plugin owns the Swift-side handle's lifetime; nothing
|
|
205
|
+
// to free from JS. The bundle installer is responsible for the
|
|
206
|
+
// `.mlpackage` cleanup if the user deletes a tier.
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function decodeBase64Png(base64: string): Uint8Array {
|
|
212
|
+
if (typeof base64 !== "string" || !base64) {
|
|
213
|
+
throw new ImageGenBackendUnavailableError(
|
|
214
|
+
"coreml",
|
|
215
|
+
"unsupported_request",
|
|
216
|
+
"[imagegen/coreml] Capacitor bridge returned empty base64 payload",
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
const buf = Buffer.from(base64, "base64");
|
|
220
|
+
if (buf.length < PNG_SIGNATURE.length) {
|
|
221
|
+
throw new ImageGenBackendUnavailableError(
|
|
222
|
+
"coreml",
|
|
223
|
+
"unsupported_request",
|
|
224
|
+
`[imagegen/coreml] base64 payload too short (${buf.length} bytes); not a PNG`,
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
for (let i = 0; i < PNG_SIGNATURE.length; i += 1) {
|
|
228
|
+
if (buf[i] !== PNG_SIGNATURE[i]) {
|
|
229
|
+
throw new ImageGenBackendUnavailableError(
|
|
230
|
+
"coreml",
|
|
231
|
+
"unsupported_request",
|
|
232
|
+
"[imagegen/coreml] base64 payload missing PNG signature",
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return new Uint8Array(buf);
|
|
237
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured error every WS3 backend throws when it can't serve a
|
|
3
|
+
* request. Mirrors `VisionBackendUnavailableError` so the arbiter / WS3
|
|
4
|
+
* provider handler can surface a single typed failure mode upward.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ImageGenBackendUnavailableError extends Error {
|
|
7
|
+
readonly backendId: string;
|
|
8
|
+
readonly reason: "binary_missing" | "binary_version_mismatch" | "cuda_binary_missing" | "vulkan_binary_missing" | "metal_binary_missing" | "cuda_unavailable" | "model_missing" | "binding_unavailable" | "unsupported_runtime" | "unsupported_request" | "subprocess_failed";
|
|
9
|
+
readonly code = "IMAGE_GEN_BACKEND_UNAVAILABLE";
|
|
10
|
+
constructor(backendId: string, reason: "binary_missing" | "binary_version_mismatch" | "cuda_binary_missing" | "vulkan_binary_missing" | "metal_binary_missing" | "cuda_unavailable" | "model_missing" | "binding_unavailable" | "unsupported_runtime" | "unsupported_request" | "subprocess_failed", message: string, options?: {
|
|
11
|
+
cause?: unknown;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
/** Tells callers whether a thrown error came from a backend availability check. */
|
|
15
|
+
export declare function isImageGenUnavailable(err: unknown): err is ImageGenBackendUnavailableError;
|
|
16
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,+BAAgC,SAAQ,KAAK;IAGxD,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,MAAM,EACZ,gBAAgB,GAChB,yBAAyB,GACzB,qBAAqB,GACrB,uBAAuB,GACvB,sBAAsB,GACtB,kBAAkB,GAClB,eAAe,GACf,qBAAqB,GACrB,qBAAqB,GACrB,qBAAqB,GACrB,mBAAmB;IAdvB,QAAQ,CAAC,IAAI,mCAAmC;gBAEtC,SAAS,EAAE,MAAM,EACjB,MAAM,EACZ,gBAAgB,GAChB,yBAAyB,GACzB,qBAAqB,GACrB,uBAAuB,GACvB,sBAAsB,GACtB,kBAAkB,GAClB,eAAe,GACf,qBAAqB,GACrB,qBAAqB,GACrB,qBAAqB,GACrB,mBAAmB,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAK9B;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CACpC,GAAG,EAAE,OAAO,GACV,GAAG,IAAI,+BAA+B,CAOxC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured error every WS3 backend throws when it can't serve a
|
|
3
|
+
* request. Mirrors `VisionBackendUnavailableError` so the arbiter / WS3
|
|
4
|
+
* provider handler can surface a single typed failure mode upward.
|
|
5
|
+
*/
|
|
6
|
+
export class ImageGenBackendUnavailableError extends Error {
|
|
7
|
+
readonly code = "IMAGE_GEN_BACKEND_UNAVAILABLE";
|
|
8
|
+
constructor(
|
|
9
|
+
readonly backendId: string,
|
|
10
|
+
readonly reason:
|
|
11
|
+
| "binary_missing"
|
|
12
|
+
| "binary_version_mismatch"
|
|
13
|
+
| "cuda_binary_missing"
|
|
14
|
+
| "vulkan_binary_missing"
|
|
15
|
+
| "metal_binary_missing"
|
|
16
|
+
| "cuda_unavailable"
|
|
17
|
+
| "model_missing"
|
|
18
|
+
| "binding_unavailable"
|
|
19
|
+
| "unsupported_runtime"
|
|
20
|
+
| "unsupported_request"
|
|
21
|
+
| "subprocess_failed",
|
|
22
|
+
message: string,
|
|
23
|
+
options?: { cause?: unknown },
|
|
24
|
+
) {
|
|
25
|
+
super(message, options);
|
|
26
|
+
this.name = "ImageGenBackendUnavailableError";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Tells callers whether a thrown error came from a backend availability check. */
|
|
31
|
+
export function isImageGenUnavailable(
|
|
32
|
+
err: unknown,
|
|
33
|
+
): err is ImageGenBackendUnavailableError {
|
|
34
|
+
return (
|
|
35
|
+
err instanceof ImageGenBackendUnavailableError ||
|
|
36
|
+
(typeof err === "object" &&
|
|
37
|
+
err !== null &&
|
|
38
|
+
(err as { code?: unknown }).code === "IMAGE_GEN_BACKEND_UNAVAILABLE")
|
|
39
|
+
);
|
|
40
|
+
}
|