@atomic-chat/core 0.13.6 → 0.18.3
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/README.md +1 -1
- package/dist/app-daemon.js +9 -0
- package/dist/app-daemon.js.map +1 -1
- package/dist/backend/advisor/advisor.d.ts +8 -7
- package/dist/backend/advisor/advisor.js +17 -25
- package/dist/backend/advisor/advisor.js.map +1 -1
- package/dist/backend/catalog/index.d.ts +4 -2
- package/dist/backend/catalog/index.js +4 -2
- package/dist/backend/catalog/index.js.map +1 -1
- package/dist/backend/catalog/manifest.d.ts +5 -51
- package/dist/backend/catalog/manifest.js +5 -93
- package/dist/backend/catalog/manifest.js.map +1 -1
- package/dist/backend/catalog/upstream-releases-baseline.d.ts +2 -0
- package/dist/backend/catalog/upstream-releases-baseline.js +12 -0
- package/dist/backend/catalog/upstream-releases-baseline.js.map +1 -0
- package/dist/backend/catalog/upstream-releases-baseline.json +101 -0
- package/dist/backend/catalog/upstream-releases-catalog.d.ts +54 -0
- package/dist/backend/catalog/upstream-releases-catalog.js +148 -0
- package/dist/backend/catalog/upstream-releases-catalog.js.map +1 -0
- package/dist/backend/catalog/upstream-releases.d.ts +75 -0
- package/dist/backend/catalog/upstream-releases.js +155 -0
- package/dist/backend/catalog/upstream-releases.js.map +1 -0
- package/dist/backend/install/service.d.ts +7 -4
- package/dist/backend/install/service.js +4 -4
- package/dist/backend/install/service.js.map +1 -1
- package/dist/cli/commands/serve.js +10 -28
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/main.d.ts +1 -1
- package/dist/cli/main.js +5 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/client/control-client.d.ts +16 -19
- package/dist/client/control-client.js +24 -29
- package/dist/client/control-client.js.map +1 -1
- package/dist/cloud/registry.d.ts +14 -1
- package/dist/cloud/registry.js +74 -2
- package/dist/cloud/registry.js.map +1 -1
- package/dist/config/paths.d.ts +8 -3
- package/dist/config/paths.js +21 -9
- package/dist/config/paths.js.map +1 -1
- package/dist/contracts/diffusion.d.ts +45 -18
- package/dist/contracts/diffusion.js +1 -1
- package/dist/contracts/diffusion.js.map +1 -1
- package/dist/contracts/engine-builds.d.ts +1 -1
- package/dist/contracts/engine-builds.js +1 -1
- package/dist/contracts/engine-builds.js.map +1 -1
- package/dist/contracts/engines.d.ts +1 -1
- package/dist/contracts/engines.js +4 -0
- package/dist/contracts/engines.js.map +1 -1
- package/dist/contracts/errors.d.ts +8 -4
- package/dist/contracts/errors.js +16 -0
- package/dist/contracts/errors.js.map +1 -1
- package/dist/contracts/events.d.ts +18 -6
- package/dist/contracts/foundry-local.d.ts +77 -0
- package/dist/contracts/foundry-local.js +17 -0
- package/dist/contracts/foundry-local.js.map +1 -0
- package/dist/contracts/index.d.ts +2 -1
- package/dist/contracts/index.js +2 -1
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/media.d.ts +186 -0
- package/dist/contracts/media.js +55 -0
- package/dist/contracts/media.js.map +1 -0
- package/dist/contracts/model-yml.d.ts +28 -0
- package/dist/contracts/model-yml.js +11 -0
- package/dist/contracts/model-yml.js.map +1 -1
- package/dist/contracts/session.d.ts +14 -1
- package/dist/contracts/session.js +10 -0
- package/dist/contracts/session.js.map +1 -1
- package/dist/contracts/settings.d.ts +40 -1
- package/dist/contracts/settings.js.map +1 -1
- package/dist/core/atomic-core.d.ts +5 -5
- package/dist/core/atomic-core.js.map +1 -1
- package/dist/core/create.js +149 -64
- package/dist/core/create.js.map +1 -1
- package/dist/core/managed-engines.js +2 -0
- package/dist/core/managed-engines.js.map +1 -1
- package/dist/core/prism.d.ts +21 -6
- package/dist/core/prism.js +44 -0
- package/dist/core/prism.js.map +1 -1
- package/dist/core/types.d.ts +9 -5
- package/dist/diffusion/gallery.d.ts +24 -3
- package/dist/diffusion/gallery.js +151 -21
- package/dist/diffusion/gallery.js.map +1 -1
- package/dist/diffusion/index.d.ts +3 -0
- package/dist/diffusion/index.js +3 -0
- package/dist/diffusion/index.js.map +1 -1
- package/dist/diffusion/install.d.ts +0 -4
- package/dist/diffusion/install.js +5 -2
- package/dist/diffusion/install.js.map +1 -1
- package/dist/diffusion/jobs.d.ts +6 -1
- package/dist/diffusion/jobs.js +6 -1
- package/dist/diffusion/jobs.js.map +1 -1
- package/dist/diffusion/media-header.d.ts +22 -0
- package/dist/diffusion/media-header.js +149 -0
- package/dist/diffusion/media-header.js.map +1 -0
- package/dist/diffusion/parse.d.ts +3 -1
- package/dist/diffusion/parse.js +36 -0
- package/dist/diffusion/parse.js.map +1 -1
- package/dist/diffusion/recipe.d.ts +10 -1
- package/dist/diffusion/recipe.js +85 -21
- package/dist/diffusion/recipe.js.map +1 -1
- package/dist/diffusion/remote-job.d.ts +76 -0
- package/dist/diffusion/remote-job.js +643 -0
- package/dist/diffusion/remote-job.js.map +1 -0
- package/dist/diffusion/remote-store.d.ts +38 -0
- package/dist/diffusion/remote-store.js +91 -0
- package/dist/diffusion/remote-store.js.map +1 -0
- package/dist/diffusion/server-process.d.ts +5 -2
- package/dist/diffusion/server-process.js +10 -2
- package/dist/diffusion/server-process.js.map +1 -1
- package/dist/diffusion/service.d.ts +9 -1
- package/dist/diffusion/service.js +49 -9
- package/dist/diffusion/service.js.map +1 -1
- package/dist/diffusion/state.d.ts +13 -1
- package/dist/diffusion/state.js +8 -0
- package/dist/diffusion/state.js.map +1 -1
- package/dist/diffusion/video-gallery.d.ts +11 -4
- package/dist/diffusion/video-gallery.js +62 -25
- package/dist/diffusion/video-gallery.js.map +1 -1
- package/dist/diffusion/video-history.js +4 -1
- package/dist/diffusion/video-history.js.map +1 -1
- package/dist/diffusion/video-recipe.js +58 -25
- package/dist/diffusion/video-recipe.js.map +1 -1
- package/dist/diffusion/wiring.d.ts +3 -0
- package/dist/diffusion/wiring.js +1 -0
- package/dist/diffusion/wiring.js.map +1 -1
- package/dist/downloads/archive.d.ts +1 -1
- package/dist/downloads/archive.js +2 -2
- package/dist/downloads/archive.js.map +1 -1
- package/dist/downloads/downloader.d.ts +1 -18
- package/dist/downloads/downloader.js +1 -45
- package/dist/downloads/downloader.js.map +1 -1
- package/dist/engine-builds/engines.d.ts +83 -0
- package/dist/engine-builds/engines.js +144 -0
- package/dist/engine-builds/engines.js.map +1 -0
- package/dist/engine-builds/foundry-local.d.ts +22 -0
- package/dist/engine-builds/foundry-local.js +100 -0
- package/dist/engine-builds/foundry-local.js.map +1 -0
- package/dist/engine-builds/manifest.d.ts +57 -6
- package/dist/engine-builds/manifest.js +109 -4
- package/dist/engine-builds/manifest.js.map +1 -1
- package/dist/engine-builds/order.d.ts +2 -1
- package/dist/engine-builds/order.js +11 -4
- package/dist/engine-builds/order.js.map +1 -1
- package/dist/engine-builds/select.d.ts +27 -0
- package/dist/engine-builds/select.js +45 -0
- package/dist/engine-builds/select.js.map +1 -1
- package/dist/engine-builds/service.d.ts +14 -15
- package/dist/engine-builds/service.js +68 -126
- package/dist/engine-builds/service.js.map +1 -1
- package/dist/engines/service.d.ts +6 -3
- package/dist/engines/service.js +6 -3
- package/dist/engines/service.js.map +1 -1
- package/dist/hardware/index.d.ts +1 -0
- package/dist/hardware/index.js +1 -0
- package/dist/hardware/index.js.map +1 -1
- package/dist/hardware/npu.d.ts +14 -0
- package/dist/hardware/npu.js +29 -0
- package/dist/hardware/npu.js.map +1 -0
- package/dist/integrations/detect.d.ts +2 -0
- package/dist/integrations/detect.js +4 -3
- package/dist/integrations/detect.js.map +1 -1
- package/dist/lock/instance-lock.js +5 -2
- package/dist/lock/instance-lock.js.map +1 -1
- package/dist/lock/process-identity.d.ts +9 -3
- package/dist/lock/process-identity.js +75 -9
- package/dist/lock/process-identity.js.map +1 -1
- package/dist/media/adapters/a1111.d.ts +32 -0
- package/dist/media/adapters/a1111.js +207 -0
- package/dist/media/adapters/a1111.js.map +1 -0
- package/dist/media/adapters/aimlapi-videos.d.ts +34 -0
- package/dist/media/adapters/aimlapi-videos.js +172 -0
- package/dist/media/adapters/aimlapi-videos.js.map +1 -0
- package/dist/media/adapters/dashscope-image.d.ts +26 -0
- package/dist/media/adapters/dashscope-image.js +160 -0
- package/dist/media/adapters/dashscope-image.js.map +1 -0
- package/dist/media/adapters/dashscope-video.d.ts +47 -0
- package/dist/media/adapters/dashscope-video.js +251 -0
- package/dist/media/adapters/dashscope-video.js.map +1 -0
- package/dist/media/adapters/gemini-image.d.ts +27 -0
- package/dist/media/adapters/gemini-image.js +181 -0
- package/dist/media/adapters/gemini-image.js.map +1 -0
- package/dist/media/adapters/gemini-veo.d.ts +39 -0
- package/dist/media/adapters/gemini-veo.js +196 -0
- package/dist/media/adapters/gemini-veo.js.map +1 -0
- package/dist/media/adapters/hf-images.d.ts +85 -0
- package/dist/media/adapters/hf-images.js +439 -0
- package/dist/media/adapters/hf-images.js.map +1 -0
- package/dist/media/adapters/hf-videos.d.ts +44 -0
- package/dist/media/adapters/hf-videos.js +265 -0
- package/dist/media/adapters/hf-videos.js.map +1 -0
- package/dist/media/adapters/minimax-image.d.ts +26 -0
- package/dist/media/adapters/minimax-image.js +111 -0
- package/dist/media/adapters/minimax-image.js.map +1 -0
- package/dist/media/adapters/minimax-video-v2.d.ts +34 -0
- package/dist/media/adapters/minimax-video-v2.js +191 -0
- package/dist/media/adapters/minimax-video-v2.js.map +1 -0
- package/dist/media/adapters/minimax-video.d.ts +28 -0
- package/dist/media/adapters/minimax-video.js +155 -0
- package/dist/media/adapters/minimax-video.js.map +1 -0
- package/dist/media/adapters/mistral-agent-image.d.ts +33 -0
- package/dist/media/adapters/mistral-agent-image.js +108 -0
- package/dist/media/adapters/mistral-agent-image.js.map +1 -0
- package/dist/media/adapters/nvidia-genai.d.ts +28 -0
- package/dist/media/adapters/nvidia-genai.js +182 -0
- package/dist/media/adapters/nvidia-genai.js.map +1 -0
- package/dist/media/adapters/openai-images.d.ts +23 -0
- package/dist/media/adapters/openai-images.js +164 -0
- package/dist/media/adapters/openai-images.js.map +1 -0
- package/dist/media/adapters/openai-videos.d.ts +34 -0
- package/dist/media/adapters/openai-videos.js +175 -0
- package/dist/media/adapters/openai-videos.js.map +1 -0
- package/dist/media/adapters/openrouter-images.d.ts +25 -0
- package/dist/media/adapters/openrouter-images.js +161 -0
- package/dist/media/adapters/openrouter-images.js.map +1 -0
- package/dist/media/adapters/openrouter-videos.d.ts +43 -0
- package/dist/media/adapters/openrouter-videos.js +208 -0
- package/dist/media/adapters/openrouter-videos.js.map +1 -0
- package/dist/media/adapters/registry.d.ts +7 -0
- package/dist/media/adapters/registry.js +45 -0
- package/dist/media/adapters/registry.js.map +1 -0
- package/dist/media/adapters/types.d.ts +133 -0
- package/dist/media/adapters/types.js +15 -0
- package/dist/media/adapters/types.js.map +1 -0
- package/dist/media/adapters/xai-images.d.ts +19 -0
- package/dist/media/adapters/xai-images.js +83 -0
- package/dist/media/adapters/xai-images.js.map +1 -0
- package/dist/media/adapters/xai-videos.d.ts +29 -0
- package/dist/media/adapters/xai-videos.js +148 -0
- package/dist/media/adapters/xai-videos.js.map +1 -0
- package/dist/media/catalog-baseline.d.ts +2 -0
- package/dist/media/catalog-baseline.js +10 -0
- package/dist/media/catalog-baseline.js.map +1 -0
- package/dist/media/catalog-baseline.json +1819 -0
- package/dist/media/catalog-service.d.ts +42 -0
- package/dist/media/catalog-service.js +111 -0
- package/dist/media/catalog-service.js.map +1 -0
- package/dist/media/catalog.d.ts +50 -0
- package/dist/media/catalog.js +315 -0
- package/dist/media/catalog.js.map +1 -0
- package/dist/media/http.d.ts +125 -0
- package/dist/media/http.js +308 -0
- package/dist/media/http.js.map +1 -0
- package/dist/media/index.d.ts +14 -0
- package/dist/media/index.js +15 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/mask.d.ts +12 -0
- package/dist/media/mask.js +57 -0
- package/dist/media/mask.js.map +1 -0
- package/dist/media/service.d.ts +42 -0
- package/dist/media/service.js +144 -0
- package/dist/media/service.js.map +1 -0
- package/dist/models/hf.d.ts +3 -16
- package/dist/models/hf.js +4 -42
- package/dist/models/hf.js.map +1 -1
- package/dist/router/resolve.d.ts +15 -4
- package/dist/router/resolve.js +26 -3
- package/dist/router/resolve.js.map +1 -1
- package/dist/runtime/environment/linux-provisioner.js +7 -67
- package/dist/runtime/environment/linux-provisioner.js.map +1 -1
- package/dist/runtime/environment/runtime-removal-plan.d.ts +19 -0
- package/dist/runtime/environment/runtime-removal-plan.js +74 -0
- package/dist/runtime/environment/runtime-removal-plan.js.map +1 -0
- package/dist/runtime/environment/windows-provisioner.js +20 -4
- package/dist/runtime/environment/windows-provisioner.js.map +1 -1
- package/dist/runtime/foundry-local/accelerators.d.ts +42 -0
- package/dist/runtime/foundry-local/accelerators.js +153 -0
- package/dist/runtime/foundry-local/accelerators.js.map +1 -0
- package/dist/runtime/foundry-local/check.d.ts +19 -0
- package/dist/runtime/foundry-local/check.js +69 -0
- package/dist/runtime/foundry-local/check.js.map +1 -0
- package/dist/runtime/foundry-local/host/args.d.ts +44 -0
- package/dist/runtime/foundry-local/host/args.js +109 -0
- package/dist/runtime/foundry-local/host/args.js.map +1 -0
- package/dist/runtime/foundry-local/host/execution-providers.d.ts +27 -0
- package/dist/runtime/foundry-local/host/execution-providers.js +43 -0
- package/dist/runtime/foundry-local/host/execution-providers.js.map +1 -0
- package/dist/runtime/foundry-local/host/ffi-bun.d.ts +17 -0
- package/dist/runtime/foundry-local/host/ffi-bun.js +256 -0
- package/dist/runtime/foundry-local/host/ffi-bun.js.map +1 -0
- package/dist/runtime/foundry-local/host/library.d.ts +61 -0
- package/dist/runtime/foundry-local/host/library.js +17 -0
- package/dist/runtime/foundry-local/host/library.js.map +1 -0
- package/dist/runtime/foundry-local/host/run.d.ts +54 -0
- package/dist/runtime/foundry-local/host/run.js +316 -0
- package/dist/runtime/foundry-local/host/run.js.map +1 -0
- package/dist/runtime/foundry-local/host-process.d.ts +78 -0
- package/dist/runtime/foundry-local/host-process.js +182 -0
- package/dist/runtime/foundry-local/host-process.js.map +1 -0
- package/dist/runtime/foundry-local/index.d.ts +11 -0
- package/dist/runtime/foundry-local/index.js +11 -0
- package/dist/runtime/foundry-local/index.js.map +1 -0
- package/dist/runtime/foundry-local/model-yml.d.ts +8 -0
- package/dist/runtime/foundry-local/model-yml.js +63 -0
- package/dist/runtime/foundry-local/model-yml.js.map +1 -0
- package/dist/runtime/foundry-local/runtime.d.ts +88 -0
- package/dist/runtime/foundry-local/runtime.js +321 -0
- package/dist/runtime/foundry-local/runtime.js.map +1 -0
- package/dist/runtime/llamacpp/args.d.ts +5 -0
- package/dist/runtime/llamacpp/args.js +7 -1
- package/dist/runtime/llamacpp/args.js.map +1 -1
- package/dist/runtime/llamacpp/errors.d.ts +1 -0
- package/dist/runtime/llamacpp/errors.js +10 -0
- package/dist/runtime/llamacpp/errors.js.map +1 -1
- package/dist/runtime/llamacpp/load-plan.d.ts +5 -0
- package/dist/runtime/llamacpp/load-plan.js +8 -0
- package/dist/runtime/llamacpp/load-plan.js.map +1 -1
- package/dist/runtime/llamacpp/runtime-device.d.ts +8 -0
- package/dist/runtime/llamacpp/runtime-device.js +9 -3
- package/dist/runtime/llamacpp/runtime-device.js.map +1 -1
- package/dist/runtime/llamacpp/runtime.d.ts +6 -1
- package/dist/runtime/llamacpp/runtime.js +19 -3
- package/dist/runtime/llamacpp/runtime.js.map +1 -1
- package/dist/runtime/managed-engines/spec.d.ts +2 -2
- package/dist/runtime/managed-engines/spec.js +6 -0
- package/dist/runtime/managed-engines/spec.js.map +1 -1
- package/dist/runtime/managed-models/compatibility.d.ts +10 -0
- package/dist/runtime/managed-models/compatibility.js +18 -0
- package/dist/runtime/managed-models/compatibility.js.map +1 -1
- package/dist/runtime/managed-text/gateway.d.ts +2 -0
- package/dist/runtime/managed-text/gateway.js +1 -1
- package/dist/runtime/managed-text/gateway.js.map +1 -1
- package/dist/runtime/managed-text/request-rules.d.ts +9 -7
- package/dist/runtime/managed-text/request-rules.js +58 -2
- package/dist/runtime/managed-text/request-rules.js.map +1 -1
- package/dist/runtime/managed-text/setting-values.d.ts +9 -0
- package/dist/runtime/managed-text/setting-values.js +44 -0
- package/dist/runtime/managed-text/setting-values.js.map +1 -0
- package/dist/runtime/sglang/adapter.d.ts +50 -0
- package/dist/runtime/sglang/adapter.js +393 -0
- package/dist/runtime/sglang/adapter.js.map +1 -0
- package/dist/runtime/sglang/engine.d.ts +16 -0
- package/dist/runtime/sglang/engine.js +38 -0
- package/dist/runtime/sglang/engine.js.map +1 -0
- package/dist/runtime/sglang/index.d.ts +11 -0
- package/dist/runtime/sglang/index.js +12 -0
- package/dist/runtime/sglang/index.js.map +1 -0
- package/dist/runtime/sglang/memory.d.ts +64 -0
- package/dist/runtime/sglang/memory.js +90 -0
- package/dist/runtime/sglang/memory.js.map +1 -0
- package/dist/runtime/sglang/settings.d.ts +49 -0
- package/dist/runtime/sglang/settings.js +118 -0
- package/dist/runtime/sglang/settings.js.map +1 -0
- package/dist/runtime/shared/external-sessions.js +2 -0
- package/dist/runtime/shared/external-sessions.js.map +1 -1
- package/dist/runtime/shared/process.d.ts +13 -1
- package/dist/runtime/shared/process.js +21 -12
- package/dist/runtime/shared/process.js.map +1 -1
- package/dist/runtime/vllm/adapter.js +2 -47
- package/dist/runtime/vllm/adapter.js.map +1 -1
- package/dist/runtime/vllm/memory.js +3 -16
- package/dist/runtime/vllm/memory.js.map +1 -1
- package/dist/runtime/vllm/settings.d.ts +7 -0
- package/dist/runtime/vllm/settings.js +2 -30
- package/dist/runtime/vllm/settings.js.map +1 -1
- package/dist/server/control/router.js +6 -3
- package/dist/server/control/router.js.map +1 -1
- package/dist/server/control/routes/foundry-local.d.ts +10 -0
- package/dist/server/control/routes/foundry-local.js +42 -0
- package/dist/server/control/routes/foundry-local.js.map +1 -0
- package/dist/server/control/routes/media.d.ts +9 -0
- package/dist/server/control/routes/media.js +24 -0
- package/dist/server/control/routes/media.js.map +1 -0
- package/dist/server/control/routes/model-compatibility.d.ts +9 -0
- package/dist/server/control/routes/model-compatibility.js +31 -0
- package/dist/server/control/routes/model-compatibility.js.map +1 -0
- package/dist/server/control/routes/models.js +3 -1
- package/dist/server/control/routes/models.js.map +1 -1
- package/dist/server/control/types.d.ts +30 -20
- package/dist/server/control/types.js.map +1 -1
- package/dist/server/http.js +17 -2
- package/dist/server/http.js.map +1 -1
- package/dist/server/public/errors.d.ts +1 -0
- package/dist/server/public/errors.js +18 -0
- package/dist/server/public/errors.js.map +1 -1
- package/dist/server/public/images-params.js +18 -1
- package/dist/server/public/images-params.js.map +1 -1
- package/dist/server/public/images.d.ts +11 -2
- package/dist/server/public/images.js +73 -9
- package/dist/server/public/images.js.map +1 -1
- package/dist/server/public/index.js +7 -1
- package/dist/server/public/index.js.map +1 -1
- package/dist/server/public/listing.js +2 -0
- package/dist/server/public/listing.js.map +1 -1
- package/dist/server/public/remote-media.d.ts +51 -0
- package/dist/server/public/remote-media.js +225 -0
- package/dist/server/public/remote-media.js.map +1 -0
- package/dist/server/public/responses.js +4 -2
- package/dist/server/public/responses.js.map +1 -1
- package/dist/server/public/static-assets.generated.js +1 -1
- package/dist/server/public/static-assets.generated.js.map +1 -1
- package/dist/server/public/trace.js +2 -0
- package/dist/server/public/trace.js.map +1 -1
- package/dist/server/public/types.d.ts +5 -1
- package/dist/server/public/videos-params.js +13 -3
- package/dist/server/public/videos-params.js.map +1 -1
- package/dist/server/public/videos.d.ts +1 -0
- package/dist/server/public/videos.js +21 -3
- package/dist/server/public/videos.js.map +1 -1
- package/dist/settings/schema/foundry-local.json +14 -0
- package/dist/settings/schema/llamacpp-upstream.json +9 -0
- package/dist/settings/schema/sglang.json +251 -0
- package/dist/settings/schema.js +35 -1
- package/dist/settings/schema.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -5
- package/src/settings/schema/foundry-local.json +14 -0
- package/src/settings/schema/llamacpp-upstream.json +9 -0
- package/src/settings/schema/sglang.json +251 -0
- package/dist/backend/catalog/bundled-manifest-baseline.d.ts +0 -2
- package/dist/backend/catalog/bundled-manifest-baseline.js +0 -65
- package/dist/backend/catalog/bundled-manifest-baseline.js.map +0 -1
- package/dist/contracts/model-setup.d.ts +0 -115
- package/dist/contracts/model-setup.js +0 -33
- package/dist/contracts/model-setup.js.map +0 -1
- package/dist/core/model-setup/index.d.ts +0 -4
- package/dist/core/model-setup/index.js +0 -5
- package/dist/core/model-setup/index.js.map +0 -1
- package/dist/core/model-setup/plan.d.ts +0 -56
- package/dist/core/model-setup/plan.js +0 -158
- package/dist/core/model-setup/plan.js.map +0 -1
- package/dist/core/model-setup/service.d.ts +0 -92
- package/dist/core/model-setup/service.js +0 -329
- package/dist/core/model-setup/service.js.map +0 -1
- package/dist/core/model-setup/store.d.ts +0 -29
- package/dist/core/model-setup/store.js +0 -116
- package/dist/core/model-setup/store.js.map +0 -1
- package/dist/core/model-setup/wiring.d.ts +0 -59
- package/dist/core/model-setup/wiring.js +0 -132
- package/dist/core/model-setup/wiring.js.map +0 -1
- package/dist/core/tensorrt-llm.d.ts +0 -169
- package/dist/core/tensorrt-llm.js +0 -428
- package/dist/core/tensorrt-llm.js.map +0 -1
- package/dist/downloads/segmented.d.ts +0 -40
- package/dist/downloads/segmented.js +0 -170
- package/dist/downloads/segmented.js.map +0 -1
- package/dist/runtime/tensorrt-llm/delete.d.ts +0 -15
- package/dist/runtime/tensorrt-llm/delete.js +0 -60
- package/dist/runtime/tensorrt-llm/delete.js.map +0 -1
- package/dist/runtime/tensorrt-llm/guest-files.d.ts +0 -8
- package/dist/runtime/tensorrt-llm/guest-files.js +0 -49
- package/dist/runtime/tensorrt-llm/guest-files.js.map +0 -1
- package/dist/runtime/tensorrt-llm/location.d.ts +0 -20
- package/dist/runtime/tensorrt-llm/location.js +0 -48
- package/dist/runtime/tensorrt-llm/location.js.map +0 -1
- package/dist/runtime/tensorrt-llm/model-dir.d.ts +0 -38
- package/dist/runtime/tensorrt-llm/model-dir.js +0 -137
- package/dist/runtime/tensorrt-llm/model-dir.js.map +0 -1
- package/dist/runtime/tensorrt-llm/quant-format.d.ts +0 -65
- package/dist/runtime/tensorrt-llm/quant-format.js +0 -189
- package/dist/runtime/tensorrt-llm/quant-format.js.map +0 -1
- package/dist/runtime/tensorrt-llm/registry.d.ts +0 -26
- package/dist/runtime/tensorrt-llm/registry.js +0 -68
- package/dist/runtime/tensorrt-llm/registry.js.map +0 -1
- package/dist/runtime/tensorrt-llm/runtime.d.ts +0 -130
- package/dist/runtime/tensorrt-llm/runtime.js +0 -395
- package/dist/runtime/tensorrt-llm/runtime.js.map +0 -1
- package/dist/server/control/routes/model-setups.d.ts +0 -11
- package/dist/server/control/routes/model-setups.js +0 -55
- package/dist/server/control/routes/model-setups.js.map +0 -1
|
@@ -1,428 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Composition of the `tensorrt-llm` provider for `create.ts` (task 2.14): offered only on Linux, on
|
|
3
|
-
* the managed-text lifecycle built over the core's one Docker executor and journal — the startup
|
|
4
|
-
* handle the managed environment (task 2.6) wires, reconciles and hands its setup and removal too,
|
|
5
|
-
* never a second pair — the desktop deployment, this scope's managed paths,
|
|
6
|
-
* `selinuxDataRoot = <data>`, and the public server's live trusted-hosts array.
|
|
7
|
-
*
|
|
8
|
-
* What it shares with the managed environment rather than duplicating: the installation records
|
|
9
|
-
* (`InstallationStore`, the one reader of that format), the Linux machine (`LinuxHost`, which is the
|
|
10
|
-
* `ATOMIC_MANAGED_TEST_HOST` stand-in machine in the e2e suite, so that hook is read in one place),
|
|
11
|
-
* and, the other way round, `unloadEngineSessions`: a removal of the engine holds its loads off and
|
|
12
|
-
* unloads its loaded model first, through `tensorrtLlmSessionUnloader` and the facade's own unload.
|
|
13
|
-
*
|
|
14
|
-
* `wireTensorrtLlmModelCheck` (task 2.16) composes `POST /models/tensorrt-llm/check`'s deps
|
|
15
|
-
* separately from the runtime above: it shares the installation records, the descriptor provider and
|
|
16
|
-
* `LinuxHost.probeDeps`, but deliberately never touches `containers`/Docker (`check.ts`'s own file
|
|
17
|
-
* banner explains why) and is offered even when the runtime itself would refuse every load.
|
|
18
|
-
*
|
|
19
|
-
* `tensorrtLlmModelDeleter` (task 2.24) is `DELETE /models/tensorrt-llm/:id`: the same hold-and-unload
|
|
20
|
-
* through the facade as the engine removal's unloader, for one model, then its files.
|
|
21
|
-
*/
|
|
22
|
-
import { AtomicCoreError } from '../contracts/index.js';
|
|
23
|
-
import { RECONCILE_BUDGET_MS, RECONCILE_CALL_TIMEOUT_MS, RECONCILE_STARTUP_STOP_TIMEOUT_SECONDS, createDockerExec, guestRealpath, reconcileExecutions, } from '../runtime/container/index.js';
|
|
24
|
-
import { guestProbeDeps, localhostForwardingError, parseWslConfig, TENSORRT_LLM_ENGINE_ID, } from '../runtime/environment/index.js';
|
|
25
|
-
import { ManagedTextAdapterRegistry, ManagedTextLifecycle, createDesktopManagedDeployment, createWslManagedDeployment, } from '../runtime/managed-text/index.js';
|
|
26
|
-
import { TensorrtLlmModelRegistry, TensorrtLlmRuntime, checkTensorrtLlmModel, containerPlatformFor, deleteTensorrtLlmModelFiles, guestModelFiles, guestModelsRoot, linuxModelLocation, probeTensorrtLlmGpus, probeTensorrtLlmGpusAndMemory, probeTensorrtLlmHost, readTensorrtLlmModel, resolveReadyInstallation, tensorrtLlmAdapter, windowsModelLocation, } from '../runtime/tensorrt-llm/index.js';
|
|
27
|
-
import { ensureGuestScope, guestScopePaths, WSL_LOCALHOST_MOUNT, } from '../runtime/wsl/index.js';
|
|
28
|
-
/** The recorded distribution and its transport; null before the import. */
|
|
29
|
-
async function windowsDistribution(context) {
|
|
30
|
-
const record = await context.records.read();
|
|
31
|
-
return record === null ? null : { record, transport: context.wsl.distribution(record.distribution.name) };
|
|
32
|
-
}
|
|
33
|
-
async function windowsGuest(context, layout) {
|
|
34
|
-
const record = await context.records.read();
|
|
35
|
-
if (record === null)
|
|
36
|
-
return null;
|
|
37
|
-
const name = record.distribution.name;
|
|
38
|
-
const key = await context.scopeKey();
|
|
39
|
-
return {
|
|
40
|
-
record,
|
|
41
|
-
transport: context.wsl.distribution(name),
|
|
42
|
-
key,
|
|
43
|
-
paths: guestScopePaths(layout.managed, name, key, context.mount),
|
|
44
|
-
modelsRoot: (context.mount ?? WSL_LOCALHOST_MOUNT).hostPath(name, guestModelsRoot(key)),
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
const notImported = () => new AtomicCoreError('MANAGED_ADAPTER_UNAVAILABLE', 'TensorRT-LLM runs in Atomic Chat’s WSL distribution, which is not set up on this computer yet.');
|
|
48
|
-
/** Windows on x64 only: no WSL GPU path for ARM (spec `tensorrt-llm-desktop`). */
|
|
49
|
-
const windowsX64 = (platform, arch, context) => platform === 'win32' && arch === 'x64' && context !== undefined;
|
|
50
|
-
/** The provider, or null where it is not offered: everywhere but Linux and Windows x64. */
|
|
51
|
-
export function wireTensorrtLlm(options) {
|
|
52
|
-
if (options.windows !== undefined && windowsX64(options.platform, options.arch, options.windows)) {
|
|
53
|
-
return wireWindowsTensorrtLlm(options, options.windows);
|
|
54
|
-
}
|
|
55
|
-
if (options.platform !== 'linux')
|
|
56
|
-
return null;
|
|
57
|
-
const adapters = new ManagedTextAdapterRegistry();
|
|
58
|
-
adapters.register(tensorrtLlmAdapter);
|
|
59
|
-
const deployment = createDesktopManagedDeployment();
|
|
60
|
-
/** The lifecycle and the executor it was built over: the load path's probe asks the same one. */
|
|
61
|
-
let built = null;
|
|
62
|
-
// Asked at every load, through the handle: a host with no docker CLI when core started gets one
|
|
63
|
-
// from the setup's privileged step, and the next load finds it (the handle wires it then).
|
|
64
|
-
const lifecycle = async () => {
|
|
65
|
-
if (built !== null)
|
|
66
|
-
return built.lifecycle;
|
|
67
|
-
const containers = await options.containers.resolve();
|
|
68
|
-
if (containers === null)
|
|
69
|
-
return null;
|
|
70
|
-
// Two loads that raced here built nothing twice: the first to resume assigns, the second reuses.
|
|
71
|
-
built ??= {
|
|
72
|
-
exec: containers.exec,
|
|
73
|
-
lifecycle: new ManagedTextLifecycle({
|
|
74
|
-
provider: 'tensorrt-llm',
|
|
75
|
-
adapters,
|
|
76
|
-
exec: containers.exec,
|
|
77
|
-
deployment,
|
|
78
|
-
journal: containers.journal,
|
|
79
|
-
paths: options.layout.managed,
|
|
80
|
-
instanceId: options.instanceId,
|
|
81
|
-
scope: options.scope,
|
|
82
|
-
allowedHosts: options.trustedHosts,
|
|
83
|
-
selinuxDataRoot: options.layout.root,
|
|
84
|
-
emit: options.emit,
|
|
85
|
-
log: options.log,
|
|
86
|
-
...(options.containerUser === null ? {} : { containerUser: options.containerUser }),
|
|
87
|
-
}),
|
|
88
|
-
};
|
|
89
|
-
return built.lifecycle;
|
|
90
|
-
};
|
|
91
|
-
const platform = containerPlatformFor(options.arch);
|
|
92
|
-
return new TensorrtLlmRuntime({
|
|
93
|
-
lifecycle,
|
|
94
|
-
readyInstallation: () => resolveReadyInstallation({
|
|
95
|
-
installations: options.installations,
|
|
96
|
-
descriptors: options.descriptors,
|
|
97
|
-
platform,
|
|
98
|
-
}),
|
|
99
|
-
// Probed fresh at every load, never read off the environment snapshot: that view is only as new
|
|
100
|
-
// as the last setup or removal probe (and empty after a restart), while a card can disappear
|
|
101
|
-
// between two loads (spec "Выбранная карта исчезла"). An unanswered `docker info` refuses the load.
|
|
102
|
-
// Through the lifecycle's own executor: `TensorrtLlmRuntime` asks for host facts only once the
|
|
103
|
-
// lifecycle resolved, so it is always there (final review T-288 removed a dead fallback).
|
|
104
|
-
hostFacts: () => probeTensorrtLlmHost({
|
|
105
|
-
exec: options.host.probeDeps.exec,
|
|
106
|
-
docker: built.exec,
|
|
107
|
-
nvidiaSmi: 'nvidia-smi',
|
|
108
|
-
readFile: options.host.probeDeps.readFile,
|
|
109
|
-
}),
|
|
110
|
-
model: (modelId) => readTensorrtLlmModel(options.layout.provider('tensorrt-llm').modelsDir, modelId),
|
|
111
|
-
settings: options.settings,
|
|
112
|
-
...(options.claimGpu ? { claimGpu: options.claimGpu } : {}),
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* The Windows provider (change `add-tensorrt-llm-windows`, tasks 2.6–2.8): the same lifecycle and
|
|
117
|
-
* runtime as Linux, over the WSL guest — the core's one executor (the guest's docker, from the handle),
|
|
118
|
-
* this scope's folder in the guest for heartbeats, caches and the watchdog, the WSL deployment (a port
|
|
119
|
-
* Docker picks, forwarding checked), `realpath` in the guest, uid 1000 for the container, the
|
|
120
|
-
* distribution held while a model loads or is loaded; the host facts of a load read in the guest
|
|
121
|
-
* (its `nvidia-smi`, the VM's memory); models under the scope's guest root.
|
|
122
|
-
*/
|
|
123
|
-
function wireWindowsTensorrtLlm(options, context) {
|
|
124
|
-
const adapters = new ManagedTextAdapterRegistry();
|
|
125
|
-
adapters.register(tensorrtLlmAdapter);
|
|
126
|
-
let built = null;
|
|
127
|
-
const lifecycle = async () => {
|
|
128
|
-
if (built !== null)
|
|
129
|
-
return built.lifecycle;
|
|
130
|
-
const guest = await windowsGuest(context, options.layout);
|
|
131
|
-
if (guest === null)
|
|
132
|
-
throw notImported();
|
|
133
|
-
const containers = await options.containers.resolve();
|
|
134
|
-
if (containers === null)
|
|
135
|
-
return null;
|
|
136
|
-
await ensureGuestScope(guest.transport, guest.key);
|
|
137
|
-
const deployment = windowsDeployment(context, guest, containers.exec);
|
|
138
|
-
const name = guest.record.distribution.name;
|
|
139
|
-
built ??= {
|
|
140
|
-
exec: containers.exec,
|
|
141
|
-
guest,
|
|
142
|
-
lifecycle: new ManagedTextLifecycle({
|
|
143
|
-
provider: 'tensorrt-llm',
|
|
144
|
-
adapters,
|
|
145
|
-
exec: containers.exec,
|
|
146
|
-
deployment,
|
|
147
|
-
journal: containers.journal,
|
|
148
|
-
paths: guest.paths,
|
|
149
|
-
instanceId: options.instanceId,
|
|
150
|
-
scope: options.scope,
|
|
151
|
-
allowedHosts: options.trustedHosts,
|
|
152
|
-
// SELinux is not enforcing in Atomic Chat's Ubuntu guest; never used, but must be in the guest.
|
|
153
|
-
selinuxDataRoot: guest.paths.root,
|
|
154
|
-
emit: options.emit,
|
|
155
|
-
log: options.log,
|
|
156
|
-
createContainerDeps: { realpath: guestRealpath(guest.transport) },
|
|
157
|
-
containerUser: { uid: 1000, gid: 1000 },
|
|
158
|
-
keeper: context.keeper(name),
|
|
159
|
-
}),
|
|
160
|
-
};
|
|
161
|
-
return built.lifecycle;
|
|
162
|
-
};
|
|
163
|
-
const platform = containerPlatformFor(options.arch);
|
|
164
|
-
return new TensorrtLlmRuntime({
|
|
165
|
-
lifecycle,
|
|
166
|
-
readyInstallation: () => resolveReadyInstallation({
|
|
167
|
-
installations: options.installations,
|
|
168
|
-
descriptors: options.descriptors,
|
|
169
|
-
platform,
|
|
170
|
-
}),
|
|
171
|
-
hostFacts: () => {
|
|
172
|
-
const current = built;
|
|
173
|
-
const deps = guestProbeDeps(current.guest.transport);
|
|
174
|
-
return probeTensorrtLlmHost({
|
|
175
|
-
exec: deps.exec,
|
|
176
|
-
docker: current.exec,
|
|
177
|
-
nvidiaSmi: 'nvidia-smi',
|
|
178
|
-
readFile: deps.readFile,
|
|
179
|
-
});
|
|
180
|
-
},
|
|
181
|
-
model: async (modelId) => {
|
|
182
|
-
const guest = await windowsGuest(context, options.layout);
|
|
183
|
-
if (guest === null)
|
|
184
|
-
throw notImported();
|
|
185
|
-
return readTensorrtLlmModel(guest.modelsRoot, modelId);
|
|
186
|
-
},
|
|
187
|
-
settings: options.settings,
|
|
188
|
-
...(options.claimGpu ? { claimGpu: options.claimGpu } : {}),
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* The WSL deployment of one guest (task 2.7): its mounts through the context's mount, the engine probed
|
|
193
|
-
* inside the guest as root, and the forwarding error built from `.wslconfig` as it reads at that moment.
|
|
194
|
-
*/
|
|
195
|
-
export function windowsDeployment(context, guest, exec) {
|
|
196
|
-
return createWslManagedDeployment({
|
|
197
|
-
distribution: guest.record.distribution.name,
|
|
198
|
-
...(context.mount === undefined ? {} : { mount: context.mount }),
|
|
199
|
-
exec,
|
|
200
|
-
runInGuest: (argv) => guest.transport.exec(argv, { user: 'root', timeoutMs: 10_000 }),
|
|
201
|
-
forwardingError: async () => localhostForwardingError(parseWslConfig(await context.host.probeDeps.readWslConfig().catch(() => null))),
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
/** The retried reconcile's executor where the wired one already is the guest's (Windows). */
|
|
205
|
-
export const wiredExec = (wired) => wired.exec;
|
|
206
|
-
/**
|
|
207
|
-
* `GET /models/tensorrt-llm/location` (change `add-tensorrt-llm-windows`, task 2.8): `<data>/tensorrt-llm/models`
|
|
208
|
-
* on Linux; the scope's folder in the WSL guest on Windows (`MANAGED_ADAPTER_UNAVAILABLE` before the import).
|
|
209
|
-
*/
|
|
210
|
-
export function tensorrtLlmModelLocation(platform, layout, windows) {
|
|
211
|
-
if (platform === 'win32' && windows !== undefined) {
|
|
212
|
-
return () => windowsModelLocation({
|
|
213
|
-
records: windows.records,
|
|
214
|
-
scopeKey: windows.scopeKey,
|
|
215
|
-
transport: (name) => windows.wsl.distribution(name),
|
|
216
|
-
volumeFreeBytes: (path) => windows.host.freeDiskBytes(path),
|
|
217
|
-
...(windows.mount === undefined ? {} : { mount: windows.mount }),
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
return () => linuxModelLocation(layout.provider('tensorrt-llm').modelsDir);
|
|
221
|
-
}
|
|
222
|
-
/** The `tensorrt-llm` model registry: the data folder's root on Linux, the guest root (once it exists) on Windows. */
|
|
223
|
-
export function tensorrtLlmModelRegistry(platform, layout, windows) {
|
|
224
|
-
if (platform === 'win32' && windows !== undefined) {
|
|
225
|
-
return new TensorrtLlmModelRegistry(async () => (await windowsGuest(windows, layout))?.modelsRoot ?? null);
|
|
226
|
-
}
|
|
227
|
-
return new TensorrtLlmModelRegistry(layout.provider('tensorrt-llm').modelsDir);
|
|
228
|
-
}
|
|
229
|
-
/** `windowsModelFiles` bound to one context and layout: the deleter's `windowsFiles` on Windows. */
|
|
230
|
-
export function windowsModelFilesFor(windows, layout) {
|
|
231
|
-
return () => windowsModelFiles(windows, layout);
|
|
232
|
-
}
|
|
233
|
-
/** Windows: where a model's files and caches are, and how to size and remove them (in the guest). */
|
|
234
|
-
export async function windowsModelFiles(windows, layout) {
|
|
235
|
-
const guest = await windowsGuest(windows, layout);
|
|
236
|
-
if (guest === null)
|
|
237
|
-
throw notImported();
|
|
238
|
-
return { paths: guest.paths, files: guestModelFiles(guest.transport, windows.mount) };
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* `POST /models/tensorrt-llm/check` (task 2.16): `null` off Linux, where the provider is not offered
|
|
242
|
-
* at all. Available even when the engine is not installed yet — the check falls back to the latest
|
|
243
|
-
* cached descriptor itself (`check.ts`) — and never asks Docker anything, unlike `wireTensorrtLlm`'s
|
|
244
|
-
* own `hostFacts` above.
|
|
245
|
-
*/
|
|
246
|
-
export function wireTensorrtLlmModelCheck(platform, options) {
|
|
247
|
-
const windows = options.windows;
|
|
248
|
-
if (windows !== undefined && windowsX64(platform, options.arch ?? 'x64', windows)) {
|
|
249
|
-
return (body) => checkTensorrtLlmModel(body, {
|
|
250
|
-
installations: options.installations,
|
|
251
|
-
descriptors: options.descriptors,
|
|
252
|
-
// The guest's cards and the WSL VM's memory once the distribution exists (design D11); before
|
|
253
|
-
// that, the cards Windows sees, with no memory to compare against.
|
|
254
|
-
hostFacts: async () => {
|
|
255
|
-
const guest = await windowsDistribution(windows);
|
|
256
|
-
if (guest === null) {
|
|
257
|
-
const gpus = await probeTensorrtLlmGpus({
|
|
258
|
-
exec: windows.host.probeDeps.exec,
|
|
259
|
-
nvidiaSmi: `${windows.host.probeDeps.systemRoot}\\System32\\nvidia-smi.exe`,
|
|
260
|
-
});
|
|
261
|
-
return { gpus, memory: { availableBytes: 0, totalBytes: 0 } };
|
|
262
|
-
}
|
|
263
|
-
const deps = guestProbeDeps(guest.transport);
|
|
264
|
-
return probeTensorrtLlmGpusAndMemory({
|
|
265
|
-
exec: deps.exec,
|
|
266
|
-
nvidiaSmi: 'nvidia-smi',
|
|
267
|
-
readFile: deps.readFile,
|
|
268
|
-
});
|
|
269
|
-
},
|
|
270
|
-
settings: options.settings,
|
|
271
|
-
wslVm: async () => ({
|
|
272
|
-
memory_setting: parseWslConfig(await windows.host.probeDeps.readWslConfig().catch(() => null))
|
|
273
|
-
.memory,
|
|
274
|
-
}),
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
if (platform !== 'linux')
|
|
278
|
-
return null;
|
|
279
|
-
return (body) => checkTensorrtLlmModel(body, {
|
|
280
|
-
installations: options.installations,
|
|
281
|
-
descriptors: options.descriptors,
|
|
282
|
-
hostFacts: () => probeTensorrtLlmGpusAndMemory({
|
|
283
|
-
exec: options.host.probeDeps.exec,
|
|
284
|
-
nvidiaSmi: 'nvidia-smi',
|
|
285
|
-
readFile: options.host.probeDeps.readFile,
|
|
286
|
-
}),
|
|
287
|
-
settings: options.settings,
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* What GPU residency must see of the containers a previous core left (task 2.15; carry-forward from
|
|
292
|
-
* 2.12/2.14): startup reconcile could not confirm them stopped — the stop went unconfirmed, a docker
|
|
293
|
-
* call failed, or its time budget ran out — so they may still be running and holding a GPU. Which one
|
|
294
|
-
* is not recorded, so each holds every card, as `stop-unconfirmed`, under its engine id and container
|
|
295
|
-
* id, with the remedy a refusal names. Evicting one runs the reconcile again, bounded like the startup
|
|
296
|
-
* one (a short deadline per docker call, a short `--time`, a total budget), over this scope's journal
|
|
297
|
-
* only — this instance's own records are never touched — and it is released only once Docker confirms
|
|
298
|
-
* it gone.
|
|
299
|
-
*/
|
|
300
|
-
export function leftoverContainers(options) {
|
|
301
|
-
let latest = null;
|
|
302
|
-
const unresolved = (result) => [
|
|
303
|
-
...result.unconfirmed,
|
|
304
|
-
...result.failed,
|
|
305
|
-
...result.skipped,
|
|
306
|
-
];
|
|
307
|
-
const boundedExec = options.exec ??
|
|
308
|
-
((wired) => createDockerExec({
|
|
309
|
-
dockerPath: wired.dockerPath,
|
|
310
|
-
dockerConfigDir: options.dockerConfigDir,
|
|
311
|
-
timeoutMs: RECONCILE_CALL_TIMEOUT_MS,
|
|
312
|
-
}));
|
|
313
|
-
const retry = async (wired) => {
|
|
314
|
-
const budget = new AbortController();
|
|
315
|
-
const budgetMs = options.budgetMs ?? RECONCILE_BUDGET_MS;
|
|
316
|
-
if (budgetMs <= 0)
|
|
317
|
-
budget.abort();
|
|
318
|
-
const timer = setTimeout(() => budget.abort(), Math.max(budgetMs, 0));
|
|
319
|
-
timer.unref?.();
|
|
320
|
-
try {
|
|
321
|
-
return await reconcileExecutions(wired.journal, options.instanceId, boundedExec(wired), options.log, RECONCILE_STARTUP_STOP_TIMEOUT_SECONDS, budget.signal);
|
|
322
|
-
}
|
|
323
|
-
finally {
|
|
324
|
-
clearTimeout(timer);
|
|
325
|
-
}
|
|
326
|
-
};
|
|
327
|
-
return () => {
|
|
328
|
-
const wired = options.containers.current();
|
|
329
|
-
if (wired === null)
|
|
330
|
-
return [];
|
|
331
|
-
return unresolved(latest ?? wired.reconciled).map((record) => ({
|
|
332
|
-
provider: record.engine_id,
|
|
333
|
-
model_id: record.container_id,
|
|
334
|
-
cards: 'all',
|
|
335
|
-
auxiliary: false,
|
|
336
|
-
state: 'stop-unconfirmed',
|
|
337
|
-
remedy: `Start Docker, or remove container ${record.container_id} yourself ` +
|
|
338
|
-
`(docker rm -f ${record.container_id}); the next load retries the stop.`,
|
|
339
|
-
evict: async () => {
|
|
340
|
-
latest = await retry(wired);
|
|
341
|
-
if (unresolved(latest).some((left) => left.container_id === record.container_id)) {
|
|
342
|
-
throw new Error(`Docker did not confirm container ${record.container_id} stopped.`);
|
|
343
|
-
}
|
|
344
|
-
},
|
|
345
|
-
}));
|
|
346
|
-
};
|
|
347
|
-
}
|
|
348
|
-
/**
|
|
349
|
-
* The managed environment's `unloadEngineSessions` (spec "Удаление при загруженной модели"): before
|
|
350
|
-
* a removal touches the engine's image, loads of `tensorrt-llm` are held off (`holdOffLoads`) and
|
|
351
|
-
* every model holding a card is unloaded with its container's stop confirmed — through the facade's
|
|
352
|
-
* own `unload`, as a client's unload or GPU residency would, so each model's cross-process claim is
|
|
353
|
-
* released and a load still pending is cancelled rather than queued behind (final review M-1). The
|
|
354
|
-
* hold lasts until the removal calls `release`. An unconfirmed stop rejects with
|
|
355
|
-
* `MANAGED_STOP_UNCONFIRMED`, which fails the removal with nothing removed, and lifts the hold at
|
|
356
|
-
* once. `runtime` and `sessions` are read at removal time: the provider is registered after the
|
|
357
|
-
* environment is wired, and the facade after both.
|
|
358
|
-
*/
|
|
359
|
-
export function tensorrtLlmSessionUnloader(runtime, sessions) {
|
|
360
|
-
return async (engineId) => {
|
|
361
|
-
if (engineId !== TENSORRT_LLM_ENGINE_ID)
|
|
362
|
-
return { unloaded: 0 };
|
|
363
|
-
const provider = runtime();
|
|
364
|
-
if (!(provider instanceof TensorrtLlmRuntime))
|
|
365
|
-
return { unloaded: 0 };
|
|
366
|
-
const release = provider.holdOffLoads();
|
|
367
|
-
try {
|
|
368
|
-
const facade = sessions();
|
|
369
|
-
const models = provider.residentModels();
|
|
370
|
-
for (const modelId of models) {
|
|
371
|
-
facade.cancelLoad(TENSORRT_LLM_ENGINE_ID, modelId);
|
|
372
|
-
const result = await facade.unload(TENSORRT_LLM_ENGINE_ID, modelId);
|
|
373
|
-
if (!result.success) {
|
|
374
|
-
throw new AtomicCoreError('MANAGED_STOP_UNCONFIRMED', result.error ?? `The unload of ${modelId} failed.`, modelId);
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
return { unloaded: models.length, release };
|
|
378
|
-
}
|
|
379
|
-
catch (error) {
|
|
380
|
-
release();
|
|
381
|
-
throw error;
|
|
382
|
-
}
|
|
383
|
-
};
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* `DELETE /models/tensorrt-llm/:id` (task 2.24, design D12a, spec `tensorrt-llm-models` "Модель
|
|
387
|
-
* удаляется через core"). The id must be one the registry lists — exactly, never percent-decoded or
|
|
388
|
-
* resolved as a path — else `MODEL_NOT_FOUND`: a client's wrong id is an error, not a success. Loads
|
|
389
|
-
* of that model are held off for the whole deletion; a load in flight is cancelled and the model
|
|
390
|
-
* unloaded through the facade, as a client's unload would be, so its cross-process claim is released.
|
|
391
|
-
* Only once Docker confirmed the stop are the files touched; an unconfirmed stop rejects with
|
|
392
|
-
* `MANAGED_STOP_UNCONFIRMED` and removes nothing.
|
|
393
|
-
*/
|
|
394
|
-
export function tensorrtLlmModelDeleter(options) {
|
|
395
|
-
return async (modelId) => {
|
|
396
|
-
const provider = options.runtime();
|
|
397
|
-
if (!(provider instanceof TensorrtLlmRuntime)) {
|
|
398
|
-
throw new AtomicCoreError('PROVIDER_NOT_FOUND', 'tensorrt-llm is not available in this build.', TENSORRT_LLM_ENGINE_ID);
|
|
399
|
-
}
|
|
400
|
-
const model = (await options.registry.list()).find((entry) => entry.id === modelId);
|
|
401
|
-
if (model === undefined) {
|
|
402
|
-
throw new AtomicCoreError('MODEL_NOT_FOUND', `No tensorrt-llm model has the id '${modelId}'.`, modelId);
|
|
403
|
-
}
|
|
404
|
-
const release = provider.holdOffModel(modelId);
|
|
405
|
-
try {
|
|
406
|
-
const facade = options.sessions();
|
|
407
|
-
const cancelled = facade.cancelLoad(TENSORRT_LLM_ENGINE_ID, modelId);
|
|
408
|
-
const result = await facade.unload(TENSORRT_LLM_ENGINE_ID, modelId);
|
|
409
|
-
if (!result.success || provider.residentModels().includes(modelId)) {
|
|
410
|
-
throw new AtomicCoreError('MANAGED_STOP_UNCONFIRMED', result.error ?? `The container of ${modelId} did not confirm its stop; nothing was deleted.`, modelId);
|
|
411
|
-
}
|
|
412
|
-
const guest = options.windowsFiles === undefined ? null : await options.windowsFiles();
|
|
413
|
-
const files = guest === null
|
|
414
|
-
? await deleteTensorrtLlmModelFiles(options.paths, model)
|
|
415
|
-
: await deleteTensorrtLlmModelFiles(guest.paths, model, guest.files);
|
|
416
|
-
return {
|
|
417
|
-
model_id: modelId,
|
|
418
|
-
was_loaded: cancelled || result.was_loaded === true,
|
|
419
|
-
freed_bytes: files.freedBytes,
|
|
420
|
-
engine_caches_removed: files.engineCachesRemoved,
|
|
421
|
-
};
|
|
422
|
-
}
|
|
423
|
-
finally {
|
|
424
|
-
release();
|
|
425
|
-
}
|
|
426
|
-
};
|
|
427
|
-
}
|
|
428
|
-
//# sourceMappingURL=tensorrt-llm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tensorrt-llm.js","sourceRoot":"","sources":["../../src/core/tensorrt-llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* One large, hash-pinned file over several bounded byte ranges at once (`DownloaderDeps.streams`).
|
|
3
|
-
* Each range is appended to its own file under `<save path>.segments/`, so an interrupted download
|
|
4
|
-
* keeps what every range already has; the directory is reused only for the same URL, size, hash and
|
|
5
|
-
* stream count. When every range is complete they are joined into `<save path>.tmp` and renamed into
|
|
6
|
-
* place; the downloader verifies size and hash afterwards, as for any file.
|
|
7
|
-
*
|
|
8
|
-
* A server that does not answer a range with a matching 206 (a 200, a 416, a different
|
|
9
|
-
* `Content-Range`, more bytes than asked for) makes the whole file fall back to one stream: the
|
|
10
|
-
* function returns `false` and leaves nothing behind. Any other failure is retried per range with the
|
|
11
|
-
* downloader's own backoff, the counter reset by fresh progress; a range that receives nothing for
|
|
12
|
-
* `inactivityTimeoutMs` is retried as a stall.
|
|
13
|
-
*/
|
|
14
|
-
/** The most ranges one file is fetched over, whatever is asked for. */
|
|
15
|
-
export declare const MAX_DOWNLOAD_STREAMS = 4;
|
|
16
|
-
/** Smallest file worth splitting: below this one stream is as fast and simpler. */
|
|
17
|
-
export declare const SEGMENTED_MIN_BYTES: number;
|
|
18
|
-
/** How long a range may receive nothing before it counts as stalled and is retried. */
|
|
19
|
-
export declare const SEGMENT_INACTIVITY_TIMEOUT_MS = 120000;
|
|
20
|
-
/** At most one progress report per this many milliseconds while ranges are flowing. */
|
|
21
|
-
export declare const SEGMENT_PROGRESS_INTERVAL_MS = 200;
|
|
22
|
-
export interface SegmentedDownload {
|
|
23
|
-
url: string;
|
|
24
|
-
/** Final path; `.segments/` and `.tmp` live beside it. */
|
|
25
|
-
destination: string;
|
|
26
|
-
size: number;
|
|
27
|
-
sha256: string;
|
|
28
|
-
streams: number;
|
|
29
|
-
fetch: typeof fetch;
|
|
30
|
-
headers: Record<string, string>;
|
|
31
|
-
signal: AbortSignal;
|
|
32
|
-
sleep: (ms: number, signal: AbortSignal) => Promise<void>;
|
|
33
|
-
retryBaseMs: number;
|
|
34
|
-
now: () => number;
|
|
35
|
-
/** Bytes held across every range so far. */
|
|
36
|
-
progress: (transferred: number) => void;
|
|
37
|
-
inactivityTimeoutMs?: number;
|
|
38
|
-
}
|
|
39
|
-
/** `true` when the file is in place; `false` when the server cannot serve ranges. Throws the rest. */
|
|
40
|
-
export declare function downloadSegments(o: SegmentedDownload): Promise<boolean>;
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* One large, hash-pinned file over several bounded byte ranges at once (`DownloaderDeps.streams`).
|
|
3
|
-
* Each range is appended to its own file under `<save path>.segments/`, so an interrupted download
|
|
4
|
-
* keeps what every range already has; the directory is reused only for the same URL, size, hash and
|
|
5
|
-
* stream count. When every range is complete they are joined into `<save path>.tmp` and renamed into
|
|
6
|
-
* place; the downloader verifies size and hash afterwards, as for any file.
|
|
7
|
-
*
|
|
8
|
-
* A server that does not answer a range with a matching 206 (a 200, a 416, a different
|
|
9
|
-
* `Content-Range`, more bytes than asked for) makes the whole file fall back to one stream: the
|
|
10
|
-
* function returns `false` and leaves nothing behind. Any other failure is retried per range with the
|
|
11
|
-
* downloader's own backoff, the counter reset by fresh progress; a range that receives nothing for
|
|
12
|
-
* `inactivityTimeoutMs` is retried as a stall.
|
|
13
|
-
*/
|
|
14
|
-
import { createReadStream } from 'node:fs';
|
|
15
|
-
import { mkdir, open, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
|
|
16
|
-
import { join } from 'node:path';
|
|
17
|
-
import { MAX_STREAM_RETRIES, RETRY_RESET_PROGRESS_BYTES, retryDelayMs } from './protocol.js';
|
|
18
|
-
/** The most ranges one file is fetched over, whatever is asked for. */
|
|
19
|
-
export const MAX_DOWNLOAD_STREAMS = 4;
|
|
20
|
-
/** Smallest file worth splitting: below this one stream is as fast and simpler. */
|
|
21
|
-
export const SEGMENTED_MIN_BYTES = 32 * 1024 * 1024;
|
|
22
|
-
/** How long a range may receive nothing before it counts as stalled and is retried. */
|
|
23
|
-
export const SEGMENT_INACTIVITY_TIMEOUT_MS = 120_000;
|
|
24
|
-
/** At most one progress report per this many milliseconds while ranges are flowing. */
|
|
25
|
-
export const SEGMENT_PROGRESS_INTERVAL_MS = 200;
|
|
26
|
-
/** The server cannot serve this file in ranges; the caller downloads it in one stream instead. */
|
|
27
|
-
class RangeUnavailable extends Error {
|
|
28
|
-
}
|
|
29
|
-
/** Stalled: the range received nothing for the inactivity timeout. Retried like any stream error. */
|
|
30
|
-
class RangeStalled extends Error {
|
|
31
|
-
}
|
|
32
|
-
/** `true` when the file is in place; `false` when the server cannot serve ranges. Throws the rest. */
|
|
33
|
-
export async function downloadSegments(o) {
|
|
34
|
-
const count = Math.max(1, Math.min(MAX_DOWNLOAD_STREAMS, Math.floor(o.streams)));
|
|
35
|
-
const chunk = Math.ceil(o.size / count);
|
|
36
|
-
const directory = `${o.destination}.segments`;
|
|
37
|
-
const identity = JSON.stringify([o.url, o.size, o.sha256, count]);
|
|
38
|
-
if ((await readFile(join(directory, 'identity'), 'utf8').catch(() => '')) !== identity) {
|
|
39
|
-
await rm(directory, { recursive: true, force: true });
|
|
40
|
-
}
|
|
41
|
-
await mkdir(directory, { recursive: true });
|
|
42
|
-
await writeFile(join(directory, 'identity'), identity);
|
|
43
|
-
// One range failing for good stops the others: the file cannot complete anyway.
|
|
44
|
-
const stopAll = new AbortController();
|
|
45
|
-
const signal = AbortSignal.any([o.signal, stopAll.signal]);
|
|
46
|
-
const held = Array(count).fill(0);
|
|
47
|
-
let reportedAt = Number.NEGATIVE_INFINITY;
|
|
48
|
-
const report = (force = false) => {
|
|
49
|
-
const now = o.now();
|
|
50
|
-
if (!force && now - reportedAt < SEGMENT_PROGRESS_INTERVAL_MS)
|
|
51
|
-
return;
|
|
52
|
-
reportedAt = now;
|
|
53
|
-
o.progress(held.reduce((a, b) => a + b, 0));
|
|
54
|
-
};
|
|
55
|
-
const inactivity = o.inactivityTimeoutMs ?? SEGMENT_INACTIVITY_TIMEOUT_MS;
|
|
56
|
-
const transfer = async (i) => {
|
|
57
|
-
const start = i * chunk;
|
|
58
|
-
const end = Math.min(o.size, start + chunk) - 1;
|
|
59
|
-
const length = end - start + 1;
|
|
60
|
-
const path = join(directory, String(i));
|
|
61
|
-
held[i] = Math.min(length, await stat(path).then((s) => s.size, () => 0));
|
|
62
|
-
if (held[i] === length)
|
|
63
|
-
return report(true);
|
|
64
|
-
let retries = 0;
|
|
65
|
-
let sinceReset = 0;
|
|
66
|
-
for (;;) {
|
|
67
|
-
signal.throwIfAborted();
|
|
68
|
-
const attempt = new AbortController();
|
|
69
|
-
let timer;
|
|
70
|
-
const arm = () => {
|
|
71
|
-
clearTimeout(timer);
|
|
72
|
-
timer = setTimeout(() => attempt.abort(new RangeStalled(`no data received for ${inactivity / 1000} seconds`)), inactivity);
|
|
73
|
-
};
|
|
74
|
-
let response;
|
|
75
|
-
try {
|
|
76
|
-
const from = start + held[i];
|
|
77
|
-
arm();
|
|
78
|
-
response = await o.fetch(o.url, {
|
|
79
|
-
headers: { ...o.headers, Range: `bytes=${from}-${end}` },
|
|
80
|
-
signal: AbortSignal.any([signal, attempt.signal]),
|
|
81
|
-
});
|
|
82
|
-
if (response.status === 200 || response.status === 416) {
|
|
83
|
-
throw new RangeUnavailable(`HTTP ${response.status} to a range request`);
|
|
84
|
-
}
|
|
85
|
-
if (response.status !== 206)
|
|
86
|
-
throw new Error(`HTTP ${response.status}`);
|
|
87
|
-
if (response.headers.get('content-range') !== `bytes ${from}-${end}/${o.size}`) {
|
|
88
|
-
throw new RangeUnavailable('a Content-Range that does not match the request');
|
|
89
|
-
}
|
|
90
|
-
if (!response.body)
|
|
91
|
-
throw new Error('no body');
|
|
92
|
-
const file = await open(path, 'a', 0o600);
|
|
93
|
-
const reader = response.body.getReader();
|
|
94
|
-
try {
|
|
95
|
-
for (;;) {
|
|
96
|
-
arm();
|
|
97
|
-
const { done, value } = await reader.read();
|
|
98
|
-
if (done)
|
|
99
|
-
break;
|
|
100
|
-
if (held[i] + value.byteLength > length) {
|
|
101
|
-
throw new RangeUnavailable('more bytes than the range asked for');
|
|
102
|
-
}
|
|
103
|
-
await file.writeFile(value);
|
|
104
|
-
held[i] = held[i] + value.byteLength;
|
|
105
|
-
sinceReset += value.byteLength;
|
|
106
|
-
if (sinceReset >= RETRY_RESET_PROGRESS_BYTES) {
|
|
107
|
-
retries = 0;
|
|
108
|
-
sinceReset = 0;
|
|
109
|
-
}
|
|
110
|
-
report();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
finally {
|
|
114
|
-
await reader.cancel().catch(() => { });
|
|
115
|
-
await file.close();
|
|
116
|
-
}
|
|
117
|
-
if (held[i] !== length)
|
|
118
|
-
throw new Error(`the range ended after ${held[i]} of ${length} bytes`);
|
|
119
|
-
return report(true);
|
|
120
|
-
}
|
|
121
|
-
catch (error) {
|
|
122
|
-
await response?.body?.cancel().catch(() => { });
|
|
123
|
-
if (signal.aborted)
|
|
124
|
-
throw signal.reason;
|
|
125
|
-
const cause = attempt.signal.aborted ? attempt.signal.reason : error;
|
|
126
|
-
if (cause instanceof RangeUnavailable || retries >= MAX_STREAM_RETRIES)
|
|
127
|
-
throw cause;
|
|
128
|
-
await o.sleep(retryDelayMs(retries++, o.retryBaseMs), signal);
|
|
129
|
-
}
|
|
130
|
-
finally {
|
|
131
|
-
clearTimeout(timer);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
const results = await Promise.allSettled(Array.from({ length: count }, (_, i) => transfer(i).catch((error) => {
|
|
136
|
-
stopAll.abort(error);
|
|
137
|
-
throw error;
|
|
138
|
-
})));
|
|
139
|
-
if (o.signal.aborted)
|
|
140
|
-
throw o.signal.reason;
|
|
141
|
-
const failed = results.find((r) => r.status === 'rejected');
|
|
142
|
-
if (failed !== undefined) {
|
|
143
|
-
// The first range to fail stopped the rest; its reason is the one that matters.
|
|
144
|
-
const reason = stopAll.signal.reason ?? failed.reason;
|
|
145
|
-
if (reason instanceof RangeUnavailable) {
|
|
146
|
-
await rm(directory, { recursive: true, force: true });
|
|
147
|
-
return false;
|
|
148
|
-
}
|
|
149
|
-
throw reason;
|
|
150
|
-
}
|
|
151
|
-
const temporary = `${o.destination}.tmp`;
|
|
152
|
-
const output = await open(temporary, 'w', 0o600);
|
|
153
|
-
try {
|
|
154
|
-
for (let i = 0; i < count; i++) {
|
|
155
|
-
for await (const buffer of createReadStream(join(directory, String(i)))) {
|
|
156
|
-
o.signal.throwIfAborted();
|
|
157
|
-
await output.writeFile(buffer);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
finally {
|
|
162
|
-
await output.close();
|
|
163
|
-
}
|
|
164
|
-
o.signal.throwIfAborted();
|
|
165
|
-
await rename(temporary, o.destination);
|
|
166
|
-
await rm(directory, { recursive: true, force: true });
|
|
167
|
-
report(true);
|
|
168
|
-
return true;
|
|
169
|
-
}
|
|
170
|
-
//# sourceMappingURL=segmented.js.map
|