@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,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local image-generation capability (WS3) — public entry point.
|
|
3
|
+
*
|
|
4
|
+
* This module is what `provider.ts` (`createImageGenerationHandler`),
|
|
5
|
+
* the UI image-gen action, and image-gen skill imports to
|
|
6
|
+
* register the capability with the WS1 MemoryArbiter.
|
|
7
|
+
*
|
|
8
|
+
* Wiring:
|
|
9
|
+
*
|
|
10
|
+
* const arbiter = service.getMemoryArbiter();
|
|
11
|
+
* const registration = createImageGenCapabilityRegistration({
|
|
12
|
+
* loader: createDefaultImageGenLoader({ ... }),
|
|
13
|
+
* });
|
|
14
|
+
* arbiter.registerCapability(registration);
|
|
15
|
+
*
|
|
16
|
+
* `createImageGenCapabilityRegistration` wraps the underlying backend
|
|
17
|
+
* so the arbiter's `run(request)` path:
|
|
18
|
+
*
|
|
19
|
+
* 1. Calls `backend.supports(request)`. If false, the arbiter throws
|
|
20
|
+
* `unsupported_request` so the caller can pick a different tier
|
|
21
|
+
* or surface a clear error.
|
|
22
|
+
* 2. Calls `backend.generate(request)` and returns the result.
|
|
23
|
+
*
|
|
24
|
+
* The capability registers with `residentRole: "vision"` so image-gen
|
|
25
|
+
* co-evicts with vision-describe — both are GPU-heavy weights with
|
|
26
|
+
* comparable RAM footprints, and the arbiter's existing one-model-per-
|
|
27
|
+
* role policy gives us free serialization. A vision-describe request
|
|
28
|
+
* arriving while image-gen is in flight will queue, wait for the
|
|
29
|
+
* generate to drain, then evict the diffusion weights and load the
|
|
30
|
+
* VL weights.
|
|
31
|
+
*/
|
|
32
|
+
export { type AospImageGenBinding, type AospImageGenHandle, type LoadAospImageGenBackendOptions, loadAospImageGenBackend, } from "./aosp-unavailable";
|
|
33
|
+
export { type ImageGenBackendChoice, type ImageGenBackendId, type ImageGenRuntimeProfile, resolveDefaultImageGenModel, selectImageGenBackends, TIER_TO_DEFAULT_IMAGE_MODEL, } from "./backend-selector";
|
|
34
|
+
export { type CoreMlImageGenBridge, type LoadCoreMlImageGenBackendOptions, loadCoreMlImageGenBackend, } from "./coreml-unavailable";
|
|
35
|
+
export { ImageGenBackendUnavailableError, isImageGenUnavailable, } from "./errors";
|
|
36
|
+
export { loadMfluxImageGenBackend, type MfluxBackendOptions, } from "./mflux";
|
|
37
|
+
export { assertPngOutput, defaultSpawn, loadSdCppImageGenBackend, PNG_SIGNATURE, pickSeed, resolveSeed, type SdCppBackendOptions, type SdCppSpawnLike, } from "./sd-cpp";
|
|
38
|
+
export { loadTensorRtImageGenBackend, type TensorRtBackendOptions, } from "./tensorrt-unavailable";
|
|
39
|
+
export type { ImageGenBackend, ImageGenBackendLoader, ImageGenLoadArgs, ImageGenMimeType, ImageGenRequest, ImageGenResult, } from "./types";
|
|
40
|
+
import type { CapabilityRegistration } from "../memory-arbiter";
|
|
41
|
+
import type { ImageGenBackend, ImageGenBackendLoader, ImageGenRequest, ImageGenResult } from "./types";
|
|
42
|
+
export interface CreateImageGenCapabilityRegistrationOptions {
|
|
43
|
+
loader: ImageGenBackendLoader;
|
|
44
|
+
/**
|
|
45
|
+
* Best-effort RAM/VRAM footprint estimate for the loaded weights. The
|
|
46
|
+
* arbiter only uses this for telemetry; eviction is by priority. The
|
|
47
|
+
* default (3500 MB) matches Z-Image-Turbo Q4_K_M; small-tier SD 1.5
|
|
48
|
+
* loaders SHOULD pass ~1100.
|
|
49
|
+
*/
|
|
50
|
+
estimatedMb?: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Build a `CapabilityRegistration` ready to feed to
|
|
54
|
+
* `arbiter.registerCapability()`. Mirrors
|
|
55
|
+
* `createVisionCapabilityRegistration` from WS2.
|
|
56
|
+
*/
|
|
57
|
+
export declare function createImageGenCapabilityRegistration(opts: CreateImageGenCapabilityRegistrationOptions): CapabilityRegistration<ImageGenBackend, ImageGenRequest, ImageGenResult>;
|
|
58
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EACN,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,8BAA8B,EACnC,uBAAuB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,2BAA2B,EAC3B,sBAAsB,EACtB,2BAA2B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,KAAK,oBAAoB,EACzB,KAAK,gCAAgC,EACrC,yBAAyB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACN,+BAA+B,EAC/B,qBAAqB,GACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,wBAAwB,EACxB,KAAK,mBAAmB,GACxB,MAAM,SAAS,CAAC;AACjB,OAAO,EACN,eAAe,EACf,YAAY,EACZ,wBAAwB,EACxB,aAAa,EACb,QAAQ,EACR,WAAW,EACX,KAAK,mBAAmB,EACxB,KAAK,cAAc,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,2BAA2B,EAC3B,KAAK,sBAAsB,GAC3B,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACX,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,cAAc,GACd,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAEX,sBAAsB,EACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EACX,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,2CAA2C;IAC3D,MAAM,EAAE,qBAAqB,CAAC;IAC9B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,oCAAoC,CACnD,IAAI,EAAE,2CAA2C,GAC/C,sBAAsB,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,CAAC,CA+B1E"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local image-generation capability (WS3) — public entry point.
|
|
3
|
+
*
|
|
4
|
+
* This module is what `provider.ts` (`createImageGenerationHandler`),
|
|
5
|
+
* the UI image-gen action, and image-gen skill imports to
|
|
6
|
+
* register the capability with the WS1 MemoryArbiter.
|
|
7
|
+
*
|
|
8
|
+
* Wiring:
|
|
9
|
+
*
|
|
10
|
+
* const arbiter = service.getMemoryArbiter();
|
|
11
|
+
* const registration = createImageGenCapabilityRegistration({
|
|
12
|
+
* loader: createDefaultImageGenLoader({ ... }),
|
|
13
|
+
* });
|
|
14
|
+
* arbiter.registerCapability(registration);
|
|
15
|
+
*
|
|
16
|
+
* `createImageGenCapabilityRegistration` wraps the underlying backend
|
|
17
|
+
* so the arbiter's `run(request)` path:
|
|
18
|
+
*
|
|
19
|
+
* 1. Calls `backend.supports(request)`. If false, the arbiter throws
|
|
20
|
+
* `unsupported_request` so the caller can pick a different tier
|
|
21
|
+
* or surface a clear error.
|
|
22
|
+
* 2. Calls `backend.generate(request)` and returns the result.
|
|
23
|
+
*
|
|
24
|
+
* The capability registers with `residentRole: "vision"` so image-gen
|
|
25
|
+
* co-evicts with vision-describe — both are GPU-heavy weights with
|
|
26
|
+
* comparable RAM footprints, and the arbiter's existing one-model-per-
|
|
27
|
+
* role policy gives us free serialization. A vision-describe request
|
|
28
|
+
* arriving while image-gen is in flight will queue, wait for the
|
|
29
|
+
* generate to drain, then evict the diffusion weights and load the
|
|
30
|
+
* VL weights.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
export {
|
|
34
|
+
type AospImageGenBinding,
|
|
35
|
+
type AospImageGenHandle,
|
|
36
|
+
type LoadAospImageGenBackendOptions,
|
|
37
|
+
loadAospImageGenBackend,
|
|
38
|
+
} from "./aosp-unavailable";
|
|
39
|
+
export {
|
|
40
|
+
type ImageGenBackendChoice,
|
|
41
|
+
type ImageGenBackendId,
|
|
42
|
+
type ImageGenRuntimeProfile,
|
|
43
|
+
resolveDefaultImageGenModel,
|
|
44
|
+
selectImageGenBackends,
|
|
45
|
+
TIER_TO_DEFAULT_IMAGE_MODEL,
|
|
46
|
+
} from "./backend-selector";
|
|
47
|
+
export {
|
|
48
|
+
type CoreMlImageGenBridge,
|
|
49
|
+
type LoadCoreMlImageGenBackendOptions,
|
|
50
|
+
loadCoreMlImageGenBackend,
|
|
51
|
+
} from "./coreml-unavailable";
|
|
52
|
+
export {
|
|
53
|
+
ImageGenBackendUnavailableError,
|
|
54
|
+
isImageGenUnavailable,
|
|
55
|
+
} from "./errors";
|
|
56
|
+
export {
|
|
57
|
+
loadMfluxImageGenBackend,
|
|
58
|
+
type MfluxBackendOptions,
|
|
59
|
+
} from "./mflux";
|
|
60
|
+
export {
|
|
61
|
+
assertPngOutput,
|
|
62
|
+
defaultSpawn,
|
|
63
|
+
loadSdCppImageGenBackend,
|
|
64
|
+
PNG_SIGNATURE,
|
|
65
|
+
pickSeed,
|
|
66
|
+
resolveSeed,
|
|
67
|
+
type SdCppBackendOptions,
|
|
68
|
+
type SdCppSpawnLike,
|
|
69
|
+
} from "./sd-cpp";
|
|
70
|
+
export {
|
|
71
|
+
loadTensorRtImageGenBackend,
|
|
72
|
+
type TensorRtBackendOptions,
|
|
73
|
+
} from "./tensorrt-unavailable";
|
|
74
|
+
export type {
|
|
75
|
+
ImageGenBackend,
|
|
76
|
+
ImageGenBackendLoader,
|
|
77
|
+
ImageGenLoadArgs,
|
|
78
|
+
ImageGenMimeType,
|
|
79
|
+
ImageGenRequest,
|
|
80
|
+
ImageGenResult,
|
|
81
|
+
} from "./types";
|
|
82
|
+
|
|
83
|
+
import type {
|
|
84
|
+
ArbiterCapability,
|
|
85
|
+
CapabilityRegistration,
|
|
86
|
+
} from "../memory-arbiter";
|
|
87
|
+
import { ImageGenBackendUnavailableError } from "./errors";
|
|
88
|
+
import type {
|
|
89
|
+
ImageGenBackend,
|
|
90
|
+
ImageGenBackendLoader,
|
|
91
|
+
ImageGenRequest,
|
|
92
|
+
ImageGenResult,
|
|
93
|
+
} from "./types";
|
|
94
|
+
|
|
95
|
+
export interface CreateImageGenCapabilityRegistrationOptions {
|
|
96
|
+
loader: ImageGenBackendLoader;
|
|
97
|
+
/**
|
|
98
|
+
* Best-effort RAM/VRAM footprint estimate for the loaded weights. The
|
|
99
|
+
* arbiter only uses this for telemetry; eviction is by priority. The
|
|
100
|
+
* default (3500 MB) matches Z-Image-Turbo Q4_K_M; small-tier SD 1.5
|
|
101
|
+
* loaders SHOULD pass ~1100.
|
|
102
|
+
*/
|
|
103
|
+
estimatedMb?: number;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Build a `CapabilityRegistration` ready to feed to
|
|
108
|
+
* `arbiter.registerCapability()`. Mirrors
|
|
109
|
+
* `createVisionCapabilityRegistration` from WS2.
|
|
110
|
+
*/
|
|
111
|
+
export function createImageGenCapabilityRegistration(
|
|
112
|
+
opts: CreateImageGenCapabilityRegistrationOptions,
|
|
113
|
+
): CapabilityRegistration<ImageGenBackend, ImageGenRequest, ImageGenResult> {
|
|
114
|
+
const capability: ArbiterCapability = "image-gen";
|
|
115
|
+
const loader = opts.loader;
|
|
116
|
+
return {
|
|
117
|
+
capability,
|
|
118
|
+
// Co-evict with vision-describe. Both are GPU-heavy modalities
|
|
119
|
+
// with similar load times; sharing the `vision` slot keeps the
|
|
120
|
+
// resident-role table flat and lets the WS1 swap path handle
|
|
121
|
+
// vision-vs-image-gen contention with the existing queue.
|
|
122
|
+
residentRole: "vision",
|
|
123
|
+
estimatedMb: opts.estimatedMb ?? 3500,
|
|
124
|
+
async load(modelKey: string): Promise<ImageGenBackend> {
|
|
125
|
+
return await loader(modelKey);
|
|
126
|
+
},
|
|
127
|
+
async unload(backend: ImageGenBackend): Promise<void> {
|
|
128
|
+
await backend.dispose();
|
|
129
|
+
},
|
|
130
|
+
async run(
|
|
131
|
+
backend: ImageGenBackend,
|
|
132
|
+
request: ImageGenRequest,
|
|
133
|
+
): Promise<ImageGenResult> {
|
|
134
|
+
if (!backend.supports(request)) {
|
|
135
|
+
throw new ImageGenBackendUnavailableError(
|
|
136
|
+
backend.id,
|
|
137
|
+
"unsupported_request",
|
|
138
|
+
`[imagegen] backend "${backend.id}" does not support this request (width=${request.width ?? "default"} height=${request.height ?? "default"} scheduler=${request.scheduler ?? "default"})`,
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
return await backend.generate(request);
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MLX-mflux image-gen backend (WS3) — macOS Apple Silicon.
|
|
3
|
+
*
|
|
4
|
+
* `mflux` is the community MLX port of FLUX.1 with Z-Image-Turbo support
|
|
5
|
+
* (https://github.com/filipstrand/mflux). It's a Python package that
|
|
6
|
+
* ships a `mflux-generate` CLI; we shell out to it from a venv the
|
|
7
|
+
* bundle installer creates at `${MODELS_DIR}/mlx/mflux`.
|
|
8
|
+
*
|
|
9
|
+
* Why a venv (and not a Node MLX binding):
|
|
10
|
+
* - MLX Python is the canonical fast path on Apple Silicon — the
|
|
11
|
+
* mflux maintainers track upstream MLX optimizations directly.
|
|
12
|
+
* - There is no stable MLX Node binding today; writing one would
|
|
13
|
+
* duplicate MLX Python's surface for very little gain. Diffusion
|
|
14
|
+
* latency dominates the IPC cost.
|
|
15
|
+
* - The mflux CLI is stable, with `--model …`, `--prompt …`,
|
|
16
|
+
* `--steps …`, `--seed …`, `--output …`.
|
|
17
|
+
*
|
|
18
|
+
* Venv resolution:
|
|
19
|
+
* 1. `opts.binaryPath` (test injection).
|
|
20
|
+
* 2. `process.env.MFLUX_BIN` (operator override; usually the venv's
|
|
21
|
+
* `bin/mflux-generate`).
|
|
22
|
+
* 3. `${MODELS_DIR}/mlx/mflux/bin/mflux-generate`.
|
|
23
|
+
*
|
|
24
|
+
* Model resolution:
|
|
25
|
+
* mflux expects `--model` to be either a HuggingFace repo id
|
|
26
|
+
* (`black-forest-labs/FLUX.1-schnell`) or a local checkpoint
|
|
27
|
+
* directory. The bundle installer writes the local path; we pass it
|
|
28
|
+
* verbatim.
|
|
29
|
+
*
|
|
30
|
+
* GPU validation status:
|
|
31
|
+
* On Apple Silicon this hits the Metal Performance Shaders backend
|
|
32
|
+
* through MLX. We have no Mac on this host — see
|
|
33
|
+
* `__tests__/imagegen-handler.test.ts` notes for the on-device check
|
|
34
|
+
* (M2 / M3 Max smoke for Z-Image-Turbo 4-step <2s 1024×1024).
|
|
35
|
+
*
|
|
36
|
+
* Publishing pipeline (macOS Apple Silicon only — Intel Mac falls back to
|
|
37
|
+
* sd-cpp Metal, see `sd-cpp.ts`):
|
|
38
|
+
*
|
|
39
|
+
* Build:
|
|
40
|
+
* python3 -m venv ${MODELS_DIR}/mlx/mflux
|
|
41
|
+
* ${MODELS_DIR}/mlx/mflux/bin/pip install --upgrade pip
|
|
42
|
+
* ${MODELS_DIR}/mlx/mflux/bin/pip install mflux # arm64-only wheel
|
|
43
|
+
* Sign:
|
|
44
|
+
* codesign --force --options runtime --timestamp \
|
|
45
|
+
* --sign "Developer ID Application: Eliza Labs Inc." \
|
|
46
|
+
* ${MODELS_DIR}/mlx/mflux/bin/python3
|
|
47
|
+
* codesign --force --options runtime --timestamp \
|
|
48
|
+
* --sign "Developer ID Application: Eliza Labs Inc." \
|
|
49
|
+
* ${MODELS_DIR}/mlx/mflux/bin/mflux-generate
|
|
50
|
+
* Notarize:
|
|
51
|
+
* ditto -c -k --keepParent ${MODELS_DIR}/mlx/mflux mflux-venv.zip
|
|
52
|
+
* xcrun notarytool submit mflux-venv.zip \
|
|
53
|
+
* --apple-id <ci-secret> --team-id <eliza-labs-team> --wait
|
|
54
|
+
* xcrun stapler staple ${MODELS_DIR}/mlx/mflux/bin/mflux-generate
|
|
55
|
+
* Drop:
|
|
56
|
+
* releases.elizaos.ai/mflux/<version>/darwin-arm64/mflux-venv.tar.zst
|
|
57
|
+
* The bundle installer untars the venv into the user's `${MODELS_DIR}/
|
|
58
|
+
* mlx/mflux/` directory; the first launch runs `mflux-generate --help`
|
|
59
|
+
* to warm up the cache.
|
|
60
|
+
*/
|
|
61
|
+
import { type SdCppSpawnLike } from "./sd-cpp";
|
|
62
|
+
import type { ImageGenBackend, ImageGenLoadArgs } from "./types";
|
|
63
|
+
export interface MfluxBackendOptions {
|
|
64
|
+
loadArgs: ImageGenLoadArgs;
|
|
65
|
+
modelKey: string;
|
|
66
|
+
binaryPath?: string;
|
|
67
|
+
outputDir?: string;
|
|
68
|
+
spawnImpl?: SdCppSpawnLike;
|
|
69
|
+
/** Test seam — when set, skips subprocess and writes these bytes. */
|
|
70
|
+
fakeImageBytes?: Uint8Array;
|
|
71
|
+
now?: () => number;
|
|
72
|
+
}
|
|
73
|
+
export declare function loadMfluxImageGenBackend(opts: MfluxBackendOptions): Promise<ImageGenBackend>;
|
|
74
|
+
//# sourceMappingURL=mflux.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mflux.d.ts","sourceRoot":"","sources":["mflux.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AAMH,OAAO,EAIN,KAAK,cAAc,EACnB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EACX,eAAe,EACf,gBAAgB,EAGhB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,qEAAqE;IACrE,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAID,wBAAsB,wBAAwB,CAC7C,IAAI,EAAE,mBAAmB,GACvB,OAAO,CAAC,eAAe,CAAC,CA8H1B"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MLX-mflux image-gen backend (WS3) — macOS Apple Silicon.
|
|
3
|
+
*
|
|
4
|
+
* `mflux` is the community MLX port of FLUX.1 with Z-Image-Turbo support
|
|
5
|
+
* (https://github.com/filipstrand/mflux). It's a Python package that
|
|
6
|
+
* ships a `mflux-generate` CLI; we shell out to it from a venv the
|
|
7
|
+
* bundle installer creates at `${MODELS_DIR}/mlx/mflux`.
|
|
8
|
+
*
|
|
9
|
+
* Why a venv (and not a Node MLX binding):
|
|
10
|
+
* - MLX Python is the canonical fast path on Apple Silicon — the
|
|
11
|
+
* mflux maintainers track upstream MLX optimizations directly.
|
|
12
|
+
* - There is no stable MLX Node binding today; writing one would
|
|
13
|
+
* duplicate MLX Python's surface for very little gain. Diffusion
|
|
14
|
+
* latency dominates the IPC cost.
|
|
15
|
+
* - The mflux CLI is stable, with `--model …`, `--prompt …`,
|
|
16
|
+
* `--steps …`, `--seed …`, `--output …`.
|
|
17
|
+
*
|
|
18
|
+
* Venv resolution:
|
|
19
|
+
* 1. `opts.binaryPath` (test injection).
|
|
20
|
+
* 2. `process.env.MFLUX_BIN` (operator override; usually the venv's
|
|
21
|
+
* `bin/mflux-generate`).
|
|
22
|
+
* 3. `${MODELS_DIR}/mlx/mflux/bin/mflux-generate`.
|
|
23
|
+
*
|
|
24
|
+
* Model resolution:
|
|
25
|
+
* mflux expects `--model` to be either a HuggingFace repo id
|
|
26
|
+
* (`black-forest-labs/FLUX.1-schnell`) or a local checkpoint
|
|
27
|
+
* directory. The bundle installer writes the local path; we pass it
|
|
28
|
+
* verbatim.
|
|
29
|
+
*
|
|
30
|
+
* GPU validation status:
|
|
31
|
+
* On Apple Silicon this hits the Metal Performance Shaders backend
|
|
32
|
+
* through MLX. We have no Mac on this host — see
|
|
33
|
+
* `__tests__/imagegen-handler.test.ts` notes for the on-device check
|
|
34
|
+
* (M2 / M3 Max smoke for Z-Image-Turbo 4-step <2s 1024×1024).
|
|
35
|
+
*
|
|
36
|
+
* Publishing pipeline (macOS Apple Silicon only — Intel Mac falls back to
|
|
37
|
+
* sd-cpp Metal, see `sd-cpp.ts`):
|
|
38
|
+
*
|
|
39
|
+
* Build:
|
|
40
|
+
* python3 -m venv ${MODELS_DIR}/mlx/mflux
|
|
41
|
+
* ${MODELS_DIR}/mlx/mflux/bin/pip install --upgrade pip
|
|
42
|
+
* ${MODELS_DIR}/mlx/mflux/bin/pip install mflux # arm64-only wheel
|
|
43
|
+
* Sign:
|
|
44
|
+
* codesign --force --options runtime --timestamp \
|
|
45
|
+
* --sign "Developer ID Application: Eliza Labs Inc." \
|
|
46
|
+
* ${MODELS_DIR}/mlx/mflux/bin/python3
|
|
47
|
+
* codesign --force --options runtime --timestamp \
|
|
48
|
+
* --sign "Developer ID Application: Eliza Labs Inc." \
|
|
49
|
+
* ${MODELS_DIR}/mlx/mflux/bin/mflux-generate
|
|
50
|
+
* Notarize:
|
|
51
|
+
* ditto -c -k --keepParent ${MODELS_DIR}/mlx/mflux mflux-venv.zip
|
|
52
|
+
* xcrun notarytool submit mflux-venv.zip \
|
|
53
|
+
* --apple-id <ci-secret> --team-id <eliza-labs-team> --wait
|
|
54
|
+
* xcrun stapler staple ${MODELS_DIR}/mlx/mflux/bin/mflux-generate
|
|
55
|
+
* Drop:
|
|
56
|
+
* releases.elizaos.ai/mflux/<version>/darwin-arm64/mflux-venv.tar.zst
|
|
57
|
+
* The bundle installer untars the venv into the user's `${MODELS_DIR}/
|
|
58
|
+
* mlx/mflux/` directory; the first launch runs `mflux-generate --help`
|
|
59
|
+
* to warm up the cache.
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
import { existsSync, promises as fs, mkdtempSync } from "node:fs";
|
|
63
|
+
import { tmpdir } from "node:os";
|
|
64
|
+
import { join } from "node:path";
|
|
65
|
+
import { ImageGenBackendUnavailableError } from "./errors";
|
|
66
|
+
import {
|
|
67
|
+
assertPngOutput,
|
|
68
|
+
defaultSpawn,
|
|
69
|
+
resolveSeed,
|
|
70
|
+
type SdCppSpawnLike,
|
|
71
|
+
} from "./sd-cpp";
|
|
72
|
+
import type {
|
|
73
|
+
ImageGenBackend,
|
|
74
|
+
ImageGenLoadArgs,
|
|
75
|
+
ImageGenRequest,
|
|
76
|
+
ImageGenResult,
|
|
77
|
+
} from "./types";
|
|
78
|
+
|
|
79
|
+
export interface MfluxBackendOptions {
|
|
80
|
+
loadArgs: ImageGenLoadArgs;
|
|
81
|
+
modelKey: string;
|
|
82
|
+
binaryPath?: string;
|
|
83
|
+
outputDir?: string;
|
|
84
|
+
spawnImpl?: SdCppSpawnLike;
|
|
85
|
+
/** Test seam — when set, skips subprocess and writes these bytes. */
|
|
86
|
+
fakeImageBytes?: Uint8Array;
|
|
87
|
+
now?: () => number;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const DEFAULT_BIN = "mflux-generate";
|
|
91
|
+
|
|
92
|
+
export async function loadMfluxImageGenBackend(
|
|
93
|
+
opts: MfluxBackendOptions,
|
|
94
|
+
): Promise<ImageGenBackend> {
|
|
95
|
+
const binary = resolveBinary(opts.binaryPath);
|
|
96
|
+
const now = opts.now ?? Date.now;
|
|
97
|
+
|
|
98
|
+
if (!opts.fakeImageBytes) {
|
|
99
|
+
await assertBinaryAvailable(binary, opts.spawnImpl);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const outputDir = opts.outputDir ?? mkdtempSync(join(tmpdir(), "mflux-"));
|
|
103
|
+
let disposed = false;
|
|
104
|
+
|
|
105
|
+
return {
|
|
106
|
+
id: "mflux",
|
|
107
|
+
supports(req) {
|
|
108
|
+
// mflux supports flexible WxH but resolution must be a /16 multiple
|
|
109
|
+
// for FLUX. SD 1.5 in mflux (less common) needs /8. We round up,
|
|
110
|
+
// so accept anything reasonable.
|
|
111
|
+
const w = req.width ?? 1024;
|
|
112
|
+
const h = req.height ?? 1024;
|
|
113
|
+
if (w <= 0 || h <= 0) return false;
|
|
114
|
+
if (w > 2048 || h > 2048) return false;
|
|
115
|
+
return true;
|
|
116
|
+
},
|
|
117
|
+
async generate(req): Promise<ImageGenResult> {
|
|
118
|
+
if (disposed) {
|
|
119
|
+
throw new ImageGenBackendUnavailableError(
|
|
120
|
+
"mflux",
|
|
121
|
+
"subprocess_failed",
|
|
122
|
+
"[imagegen/mflux] generate called after dispose()",
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
if (!req.prompt.trim()) {
|
|
126
|
+
throw new ImageGenBackendUnavailableError(
|
|
127
|
+
"mflux",
|
|
128
|
+
"unsupported_request",
|
|
129
|
+
"[imagegen/mflux] prompt is empty",
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
const seed = resolveSeed(req.seed);
|
|
133
|
+
const width = req.width ?? 1024;
|
|
134
|
+
const height = req.height ?? 1024;
|
|
135
|
+
// FLUX schnell / Z-Image-Turbo are 4-step turbo models; default
|
|
136
|
+
// to 4 here when the caller didn't specify.
|
|
137
|
+
const steps = req.steps ?? 4;
|
|
138
|
+
// FLUX schnell is CFG-free; mflux ignores the value but we record
|
|
139
|
+
// it as 0 in metadata when the caller didn't ask for one.
|
|
140
|
+
const guidanceScale = req.guidanceScale ?? 0;
|
|
141
|
+
const outputPath = join(outputDir, `out-${seed}-${now()}.png`);
|
|
142
|
+
const startMs = now();
|
|
143
|
+
|
|
144
|
+
if (opts.fakeImageBytes) {
|
|
145
|
+
await fs.writeFile(outputPath, opts.fakeImageBytes);
|
|
146
|
+
const elapsed = Math.max(1, now() - startMs);
|
|
147
|
+
if (req.onProgressChunk)
|
|
148
|
+
req.onProgressChunk({ step: steps, total: steps });
|
|
149
|
+
return {
|
|
150
|
+
image: opts.fakeImageBytes,
|
|
151
|
+
mime: "image/png",
|
|
152
|
+
seed,
|
|
153
|
+
metadata: {
|
|
154
|
+
model: opts.modelKey,
|
|
155
|
+
prompt: req.prompt,
|
|
156
|
+
steps,
|
|
157
|
+
guidanceScale,
|
|
158
|
+
inferenceTimeMs: elapsed,
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (!existsSync(opts.loadArgs.modelPath)) {
|
|
164
|
+
throw new ImageGenBackendUnavailableError(
|
|
165
|
+
"mflux",
|
|
166
|
+
"model_missing",
|
|
167
|
+
`[imagegen/mflux] model not found: ${opts.loadArgs.modelPath}`,
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const args: string[] = [
|
|
172
|
+
"--model",
|
|
173
|
+
opts.loadArgs.modelPath,
|
|
174
|
+
"--prompt",
|
|
175
|
+
req.prompt,
|
|
176
|
+
"--width",
|
|
177
|
+
String(width),
|
|
178
|
+
"--height",
|
|
179
|
+
String(height),
|
|
180
|
+
"--steps",
|
|
181
|
+
String(steps),
|
|
182
|
+
"--seed",
|
|
183
|
+
String(seed),
|
|
184
|
+
"--output",
|
|
185
|
+
outputPath,
|
|
186
|
+
];
|
|
187
|
+
if (req.guidanceScale !== undefined) {
|
|
188
|
+
args.push("--guidance", String(req.guidanceScale));
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
await runMflux(binary, args, {
|
|
192
|
+
signal: req.signal,
|
|
193
|
+
spawnImpl: opts.spawnImpl,
|
|
194
|
+
onProgressChunk: req.onProgressChunk,
|
|
195
|
+
totalSteps: steps,
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
const bytes = new Uint8Array(await fs.readFile(outputPath));
|
|
199
|
+
assertPngOutput(bytes, "mflux", "subprocess_failed");
|
|
200
|
+
const elapsed = Math.max(1, now() - startMs);
|
|
201
|
+
return {
|
|
202
|
+
image: bytes,
|
|
203
|
+
mime: "image/png",
|
|
204
|
+
seed,
|
|
205
|
+
metadata: {
|
|
206
|
+
model: opts.modelKey,
|
|
207
|
+
prompt: req.prompt,
|
|
208
|
+
steps,
|
|
209
|
+
guidanceScale,
|
|
210
|
+
inferenceTimeMs: elapsed,
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
},
|
|
214
|
+
async dispose() {
|
|
215
|
+
if (disposed) return;
|
|
216
|
+
disposed = true;
|
|
217
|
+
await fs.rm(outputDir, { recursive: true, force: true }).catch(() => {});
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function resolveBinary(override?: string): string {
|
|
223
|
+
if (override) return override;
|
|
224
|
+
const envBin = process.env.MFLUX_BIN;
|
|
225
|
+
if (envBin?.trim()) return envBin.trim();
|
|
226
|
+
return DEFAULT_BIN;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
async function assertBinaryAvailable(
|
|
230
|
+
binary: string,
|
|
231
|
+
spawnImpl?: SdCppSpawnLike,
|
|
232
|
+
): Promise<void> {
|
|
233
|
+
try {
|
|
234
|
+
const code = await new Promise<number | null>((resolve, reject) => {
|
|
235
|
+
const proc = defaultSpawn(spawnImpl)(binary, ["--help"]);
|
|
236
|
+
proc.on("error", (err: Error) => reject(err));
|
|
237
|
+
proc.on("exit", (c: number | null) => resolve(c));
|
|
238
|
+
});
|
|
239
|
+
// `mflux-generate --help` exits 0 on success. Tolerate code 2 in
|
|
240
|
+
// older mflux versions where --help is the default and exits non-zero.
|
|
241
|
+
if (code !== 0 && code !== 2) {
|
|
242
|
+
throw new ImageGenBackendUnavailableError(
|
|
243
|
+
"mflux",
|
|
244
|
+
"binary_version_mismatch",
|
|
245
|
+
`[imagegen/mflux] '${binary} --help' exited with code ${code}`,
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
} catch (err) {
|
|
249
|
+
if (err instanceof ImageGenBackendUnavailableError) throw err;
|
|
250
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
251
|
+
throw new ImageGenBackendUnavailableError(
|
|
252
|
+
"mflux",
|
|
253
|
+
"binary_missing",
|
|
254
|
+
`[imagegen/mflux] cannot run '${binary} --help': ${message}. Set MFLUX_BIN or install the bundle's mflux venv at \${MODELS_DIR}/mlx/mflux.`,
|
|
255
|
+
{ cause: err },
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
async function runMflux(
|
|
261
|
+
binary: string,
|
|
262
|
+
args: readonly string[],
|
|
263
|
+
opts: {
|
|
264
|
+
signal?: AbortSignal;
|
|
265
|
+
spawnImpl?: SdCppSpawnLike;
|
|
266
|
+
onProgressChunk?: ImageGenRequest["onProgressChunk"];
|
|
267
|
+
totalSteps: number;
|
|
268
|
+
},
|
|
269
|
+
): Promise<void> {
|
|
270
|
+
await new Promise<void>((resolve, reject) => {
|
|
271
|
+
const proc = defaultSpawn(opts.spawnImpl)(binary, args, {
|
|
272
|
+
signal: opts.signal,
|
|
273
|
+
});
|
|
274
|
+
const stderr = proc.stderr;
|
|
275
|
+
if (
|
|
276
|
+
opts.onProgressChunk &&
|
|
277
|
+
stderr &&
|
|
278
|
+
typeof (stderr as NodeJS.ReadableStream).on === "function"
|
|
279
|
+
) {
|
|
280
|
+
let leftover = "";
|
|
281
|
+
(stderr as NodeJS.ReadableStream).on("data", (chunk: Buffer | string) => {
|
|
282
|
+
const text =
|
|
283
|
+
leftover +
|
|
284
|
+
(typeof chunk === "string" ? chunk : chunk.toString("utf8"));
|
|
285
|
+
const lines = text.split(/\r?\n/);
|
|
286
|
+
leftover = lines.pop() ?? "";
|
|
287
|
+
for (const line of lines) {
|
|
288
|
+
// mflux prints `Step N/M` to stderr (tqdm-style).
|
|
289
|
+
const m = line.match(/step\s*(\d+)\s*\/\s*(\d+)/i);
|
|
290
|
+
if (!m) continue;
|
|
291
|
+
opts.onProgressChunk?.({
|
|
292
|
+
step: Number(m[1]),
|
|
293
|
+
total: Number(m[2]) || opts.totalSteps,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
proc.on("error", (err: Error) => reject(err));
|
|
299
|
+
proc.on("exit", (code: number | null) => {
|
|
300
|
+
if (code === 0) {
|
|
301
|
+
resolve();
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
reject(
|
|
305
|
+
new ImageGenBackendUnavailableError(
|
|
306
|
+
"mflux",
|
|
307
|
+
"subprocess_failed",
|
|
308
|
+
`[imagegen/mflux] mflux-generate exited with code ${code}`,
|
|
309
|
+
),
|
|
310
|
+
);
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
}
|