@atomic-chat/core 0.13.2 → 0.17.0
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/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 +0 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/client/control-client.d.ts +7 -19
- package/dist/client/control-client.js +9 -29
- package/dist/client/control-client.js.map +1 -1
- package/dist/cloud/registry.d.ts +14 -1
- package/dist/cloud/registry.js +73 -2
- package/dist/cloud/registry.js.map +1 -1
- package/dist/config/paths.d.ts +4 -3
- package/dist/config/paths.js +15 -14
- 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/engines.d.ts +1 -1
- package/dist/contracts/engines.js +2 -0
- package/dist/contracts/engines.js.map +1 -1
- package/dist/contracts/errors.d.ts +1 -3
- package/dist/contracts/errors.js +16 -0
- package/dist/contracts/errors.js.map +1 -1
- package/dist/contracts/events.d.ts +11 -6
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/index.js +1 -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/session.d.ts +10 -1
- package/dist/contracts/session.js +10 -0
- package/dist/contracts/session.js.map +1 -1
- package/dist/contracts/settings.d.ts +36 -1
- package/dist/contracts/settings.js.map +1 -1
- package/dist/core/atomic-core.d.ts +7 -5
- package/dist/core/atomic-core.js +1 -0
- package/dist/core/atomic-core.js.map +1 -1
- package/dist/core/create.js +48 -58
- 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 +23 -6
- package/dist/core/prism.js +45 -0
- package/dist/core/prism.js.map +1 -1
- package/dist/core/public-server.js +3 -2
- package/dist/core/public-server.js.map +1 -1
- package/dist/core/types.d.ts +11 -0
- package/dist/core/types.js.map +1 -1
- package/dist/decision/process.d.ts +4 -0
- package/dist/decision/process.js +10 -1
- package/dist/decision/process.js.map +1 -1
- package/dist/diffusion/args.d.ts +3 -2
- package/dist/diffusion/args.js +21 -4
- package/dist/diffusion/args.js.map +1 -1
- package/dist/diffusion/compat.d.ts +1 -1
- package/dist/diffusion/compat.js +6 -2
- package/dist/diffusion/compat.js.map +1 -1
- 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/jobs.d.ts +6 -1
- package/dist/diffusion/jobs.js +10 -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/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/tracker.d.ts +6 -0
- package/dist/diffusion/tracker.js +11 -0
- package/dist/diffusion/tracker.js.map +1 -1
- package/dist/diffusion/validate.js +2 -2
- package/dist/diffusion/validate.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/diffusion/workflow.d.ts +8 -2
- package/dist/diffusion/workflow.js +13 -5
- package/dist/diffusion/workflow.js.map +1 -1
- package/dist/downloads/downloader.d.ts +6 -1
- package/dist/downloads/downloader.js +12 -1
- package/dist/downloads/downloader.js.map +1 -1
- package/dist/embedding/process.d.ts +4 -0
- package/dist/embedding/process.js +10 -1
- package/dist/embedding/process.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/compatibility/inspect.d.ts +11 -2
- package/dist/models/compatibility/inspect.js +44 -13
- package/dist/models/compatibility/inspect.js.map +1 -1
- package/dist/models/compatibility/service.d.ts +3 -0
- package/dist/models/compatibility/service.js +1 -0
- package/dist/models/compatibility/service.js.map +1 -1
- package/dist/models/gguf/tensors.d.ts +1 -0
- package/dist/models/gguf/tensors.js +4 -1
- package/dist/models/gguf/tensors.js.map +1 -1
- 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 +25 -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/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/adapter.d.ts +17 -0
- package/dist/runtime/managed-text/adapter.js.map +1 -1
- package/dist/runtime/managed-text/lifecycle.d.ts +8 -0
- package/dist/runtime/managed-text/lifecycle.js +38 -1
- package/dist/runtime/managed-text/lifecycle.js.map +1 -1
- package/dist/runtime/managed-text/readiness.d.ts +21 -1
- package/dist/runtime/managed-text/readiness.js +64 -0
- package/dist/runtime/managed-text/readiness.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 +1 -0
- package/dist/runtime/shared/external-sessions.js.map +1 -1
- package/dist/runtime/shared/ports.d.ts +10 -0
- package/dist/runtime/shared/ports.js +30 -0
- package/dist/runtime/shared/ports.js.map +1 -1
- package/dist/runtime/tensorrt-llm/adapter.d.ts +1 -4
- package/dist/runtime/tensorrt-llm/adapter.js +28 -11
- package/dist/runtime/tensorrt-llm/adapter.js.map +1 -1
- package/dist/runtime/tensorrt-llm/check.js +1 -0
- package/dist/runtime/tensorrt-llm/check.js.map +1 -1
- package/dist/runtime/tensorrt-llm/compatibility.d.ts +30 -6
- package/dist/runtime/tensorrt-llm/compatibility.js +41 -9
- package/dist/runtime/tensorrt-llm/compatibility.js.map +1 -1
- package/dist/runtime/tensorrt-llm/cuda-graphs.d.ts +32 -0
- package/dist/runtime/tensorrt-llm/cuda-graphs.js +33 -0
- package/dist/runtime/tensorrt-llm/cuda-graphs.js.map +1 -0
- package/dist/runtime/tensorrt-llm/engine.js +11 -5
- package/dist/runtime/tensorrt-llm/engine.js.map +1 -1
- package/dist/runtime/tensorrt-llm/kv-cache.d.ts +16 -0
- package/dist/runtime/tensorrt-llm/kv-cache.js +21 -1
- package/dist/runtime/tensorrt-llm/kv-cache.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 +5 -4
- package/dist/server/control/router.js.map +1 -1
- 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/types.d.ts +18 -20
- package/dist/server/http.js +15 -2
- package/dist/server/http.js.map +1 -1
- package/dist/server/public/gates.d.ts +6 -1
- package/dist/server/public/gates.js +7 -3
- package/dist/server/public/gates.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.d.ts +1 -0
- package/dist/server/public/index.js +16 -7
- package/dist/server/public/index.js.map +1 -1
- package/dist/server/public/listing.js +1 -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 +12 -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/llamacpp-upstream.json +9 -0
- package/dist/settings/schema/sglang.json +251 -0
- package/dist/settings/schema.js +27 -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 -6
- 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/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
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an adapter is: the code that speaks one provider media API (a "dialect"). An image adapter
|
|
3
|
+
* answers a generation with the images; a video adapter submits a job, polls it and downloads the
|
|
4
|
+
* clip, because every video API is asynchronous and a clip takes minutes. The job runner
|
|
5
|
+
* (`src/diffusion/remote-job.ts`) drives both; adapters never touch the gallery, the job table or
|
|
6
|
+
* events.
|
|
7
|
+
*
|
|
8
|
+
* Rules every adapter keeps (see `http.ts`):
|
|
9
|
+
* - derive every URL from `ctx.baseUrl` in code; never take a host from the catalog;
|
|
10
|
+
* - never retry a request that starts a generation (the provider may bill twice);
|
|
11
|
+
* - throw `REMOTE_*` errors (`remoteError`, `remoteHttpError`), `CANCELLED` when `ctx.signal` fired;
|
|
12
|
+
* - read model-specific settings from `job.model.options` and parameters from `job.model.params`.
|
|
13
|
+
*/
|
|
14
|
+
import type { ImageModelDescriptor, MediaDialect, RemoteImageWorkflow, RemoteVideoWorkflow, VideoModelDescriptor } from '../../contracts/index.js';
|
|
15
|
+
import type { AtomicCoreError } from '../../contracts/index.js';
|
|
16
|
+
import type { LiveMediaModel } from '../catalog.js';
|
|
17
|
+
import type { MediaContext } from '../http.js';
|
|
18
|
+
/** An image handed to the provider: a source, a reference, a frame or a mask. */
|
|
19
|
+
export interface MediaInput {
|
|
20
|
+
bytes: Buffer;
|
|
21
|
+
mime: string;
|
|
22
|
+
}
|
|
23
|
+
export interface ImageGenerationJob {
|
|
24
|
+
model: ImageModelDescriptor;
|
|
25
|
+
prompt: string;
|
|
26
|
+
negativePrompt?: string;
|
|
27
|
+
workflow: RemoteImageWorkflow;
|
|
28
|
+
/** Images to make, within `model.params.n.max` (1 when the model has no `n`). */
|
|
29
|
+
n: number;
|
|
30
|
+
seed?: number;
|
|
31
|
+
/** The form's pixel size, for a model whose `size` is a range. */
|
|
32
|
+
width?: number;
|
|
33
|
+
height?: number;
|
|
34
|
+
/** `auto` or `WxH`, for a model whose `size` is a list. */
|
|
35
|
+
size?: string;
|
|
36
|
+
aspectRatio?: string;
|
|
37
|
+
resolution?: string;
|
|
38
|
+
quality?: string;
|
|
39
|
+
background?: string;
|
|
40
|
+
outputFormat?: string;
|
|
41
|
+
steps?: number;
|
|
42
|
+
cfgScale?: number;
|
|
43
|
+
guidance?: number;
|
|
44
|
+
sampler?: string;
|
|
45
|
+
/** Denoise strength 0..1 (`transform`, `inpaint`). */
|
|
46
|
+
strength?: number;
|
|
47
|
+
/** The source image first (every workflow but `create`), then the references. */
|
|
48
|
+
images: MediaInput[];
|
|
49
|
+
/** `inpaint`: a PNG the size of the source, white where the model repaints. */
|
|
50
|
+
mask?: MediaInput;
|
|
51
|
+
}
|
|
52
|
+
export interface GeneratedImage {
|
|
53
|
+
bytes: Buffer;
|
|
54
|
+
/** What the bytes are (`image/png`, `image/jpeg`, `image/webp`); sniffed, not the header's word. */
|
|
55
|
+
mime: string;
|
|
56
|
+
}
|
|
57
|
+
/** How far a generation got, when the provider says; both fields optional. */
|
|
58
|
+
export interface RemoteProgress {
|
|
59
|
+
/** 0..1 */
|
|
60
|
+
fraction?: number;
|
|
61
|
+
phase?: 'queued' | 'generating';
|
|
62
|
+
}
|
|
63
|
+
export interface ImageAdapter {
|
|
64
|
+
readonly dialect: MediaDialect;
|
|
65
|
+
readonly kind: 'image';
|
|
66
|
+
/** The provider's live model listing; absent when it has none (the catalog alone applies). */
|
|
67
|
+
listModels?(ctx: MediaContext): Promise<LiveMediaModel[]>;
|
|
68
|
+
generate(ctx: MediaContext, job: ImageGenerationJob, report: (progress: RemoteProgress) => void): Promise<GeneratedImage[]>;
|
|
69
|
+
}
|
|
70
|
+
export interface VideoGenerationJob {
|
|
71
|
+
model: VideoModelDescriptor;
|
|
72
|
+
prompt: string;
|
|
73
|
+
negativePrompt?: string;
|
|
74
|
+
workflow: RemoteVideoWorkflow;
|
|
75
|
+
durationSecs?: number;
|
|
76
|
+
resolution?: string;
|
|
77
|
+
aspectRatio?: string;
|
|
78
|
+
/** `WxH`, for a model whose `sizes` is a list. */
|
|
79
|
+
size?: string;
|
|
80
|
+
generateAudio?: boolean;
|
|
81
|
+
seed?: number;
|
|
82
|
+
/** `image-to-video`: the first frame. */
|
|
83
|
+
firstFrame?: MediaInput;
|
|
84
|
+
/** `image-to-video`: the last frame, when the model takes one. */
|
|
85
|
+
lastFrame?: MediaInput;
|
|
86
|
+
}
|
|
87
|
+
type Plain = string | number | boolean | null;
|
|
88
|
+
/**
|
|
89
|
+
* What a submit answered: enough to poll, download and cancel later, also after a restart of the
|
|
90
|
+
* core. Written to disk as JSON, so plain data only.
|
|
91
|
+
*/
|
|
92
|
+
export interface VideoSubmission {
|
|
93
|
+
/** The provider's job id. */
|
|
94
|
+
id: string;
|
|
95
|
+
data?: Record<string, Plain>;
|
|
96
|
+
}
|
|
97
|
+
/** Where the finished clip is: a URL the provider gave, and/or what the adapter needs to fetch it. */
|
|
98
|
+
export interface VideoResultRef {
|
|
99
|
+
url?: string;
|
|
100
|
+
data?: Record<string, Plain>;
|
|
101
|
+
}
|
|
102
|
+
export type VideoPoll = {
|
|
103
|
+
state: 'queued' | 'running'; /** 0..1 */
|
|
104
|
+
progress?: number;
|
|
105
|
+
} | {
|
|
106
|
+
state: 'completed';
|
|
107
|
+
result: VideoResultRef;
|
|
108
|
+
} | {
|
|
109
|
+
state: 'failed';
|
|
110
|
+
error: AtomicCoreError;
|
|
111
|
+
};
|
|
112
|
+
export interface VideoAdapter {
|
|
113
|
+
readonly dialect: MediaDialect;
|
|
114
|
+
readonly kind: 'video';
|
|
115
|
+
listModels?(ctx: MediaContext): Promise<LiveMediaModel[]>;
|
|
116
|
+
/** Starts the generation; never retried. */
|
|
117
|
+
submit(ctx: MediaContext, job: VideoGenerationJob): Promise<VideoSubmission>;
|
|
118
|
+
/** One look at the job; a transport failure here is retried by the runner. */
|
|
119
|
+
poll(ctx: MediaContext, submission: VideoSubmission): Promise<VideoPoll>;
|
|
120
|
+
download(ctx: MediaContext, submission: VideoSubmission, result: VideoResultRef): Promise<{
|
|
121
|
+
bytes: Buffer;
|
|
122
|
+
mime: string;
|
|
123
|
+
}>;
|
|
124
|
+
/** Best effort; most providers cannot cancel a running clip. */
|
|
125
|
+
cancel?(ctx: MediaContext, submission: VideoSubmission): Promise<void>;
|
|
126
|
+
/** How often to poll: the first wait, and the cap backoff grows it to. Default 5 s and 20 s. */
|
|
127
|
+
readonly pollIntervalMs?: {
|
|
128
|
+
first: number;
|
|
129
|
+
max: number;
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
export type MediaAdapter = ImageAdapter | VideoAdapter;
|
|
133
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an adapter is: the code that speaks one provider media API (a "dialect"). An image adapter
|
|
3
|
+
* answers a generation with the images; a video adapter submits a job, polls it and downloads the
|
|
4
|
+
* clip, because every video API is asynchronous and a clip takes minutes. The job runner
|
|
5
|
+
* (`src/diffusion/remote-job.ts`) drives both; adapters never touch the gallery, the job table or
|
|
6
|
+
* events.
|
|
7
|
+
*
|
|
8
|
+
* Rules every adapter keeps (see `http.ts`):
|
|
9
|
+
* - derive every URL from `ctx.baseUrl` in code; never take a host from the catalog;
|
|
10
|
+
* - never retry a request that starts a generation (the provider may bill twice);
|
|
11
|
+
* - throw `REMOTE_*` errors (`remoteError`, `remoteHttpError`), `CANCELLED` when `ctx.signal` fired;
|
|
12
|
+
* - read model-specific settings from `job.model.options` and parameters from `job.model.params`.
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/media/adapters/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `xai-images`: xAI's image API (Grok Imagine), registered with base `https://api.x.ai/v1`, Bearer key.
|
|
3
|
+
*
|
|
4
|
+
* Every URL is the registered base joined to a path: `create` → `POST {base}/images/generations`;
|
|
5
|
+
* `edit` and `reference` → `POST {base}/images/edits` with the inputs as data URLs, one image as
|
|
6
|
+
* `image: {url}`, several (up to five) as `images: [{url}]`, never both. xAI has no mask, so
|
|
7
|
+
* `inpaint` and `transform` are refused. The answer is the Images API shape (`data[]` with `b64_json`
|
|
8
|
+
* or a `url`); we ask for `b64_json`. The live listing is `GET {base}/image-generation-models`.
|
|
9
|
+
*/
|
|
10
|
+
import type { LiveMediaModel } from '../catalog.js';
|
|
11
|
+
import type { ImageAdapter, ImageGenerationJob } from './types.js';
|
|
12
|
+
/** The JSON body of a generation or an edit: what the job set, and the inputs for an edit. */
|
|
13
|
+
export declare function xaiImageBody(job: ImageGenerationJob): Record<string, unknown>;
|
|
14
|
+
/**
|
|
15
|
+
* The models of `GET /image-generation-models`: those that output images (when the entry says), able
|
|
16
|
+
* to edit and take references when they accept images.
|
|
17
|
+
*/
|
|
18
|
+
export declare function xaiImageModels(json: unknown): LiveMediaModel[];
|
|
19
|
+
export declare const XAI_IMAGES: ImageAdapter;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `xai-images`: xAI's image API (Grok Imagine), registered with base `https://api.x.ai/v1`, Bearer key.
|
|
3
|
+
*
|
|
4
|
+
* Every URL is the registered base joined to a path: `create` → `POST {base}/images/generations`;
|
|
5
|
+
* `edit` and `reference` → `POST {base}/images/edits` with the inputs as data URLs, one image as
|
|
6
|
+
* `image: {url}`, several (up to five) as `images: [{url}]`, never both. xAI has no mask, so
|
|
7
|
+
* `inpaint` and `transform` are refused. The answer is the Images API shape (`data[]` with `b64_json`
|
|
8
|
+
* or a `url`); we ask for `b64_json`. The live listing is `GET {base}/image-generation-models`.
|
|
9
|
+
*/
|
|
10
|
+
import { callProvider, GENERATE_TIMEOUT_MS, joinUrl, remoteError, toDataUrl } from '../http.js';
|
|
11
|
+
import { imagesFromAnswer } from './openai-images.js';
|
|
12
|
+
const WORKFLOWS = ['create', 'edit', 'reference'];
|
|
13
|
+
/** The JSON body of a generation or an edit: what the job set, and the inputs for an edit. */
|
|
14
|
+
export function xaiImageBody(job) {
|
|
15
|
+
const body = { model: job.model.id, prompt: job.prompt };
|
|
16
|
+
if (job.n > 1)
|
|
17
|
+
body['n'] = job.n;
|
|
18
|
+
if (job.aspectRatio)
|
|
19
|
+
body['aspect_ratio'] = job.aspectRatio;
|
|
20
|
+
if (job.resolution)
|
|
21
|
+
body['resolution'] = job.resolution;
|
|
22
|
+
if (job.quality)
|
|
23
|
+
body['quality'] = job.quality;
|
|
24
|
+
body['response_format'] = 'b64_json';
|
|
25
|
+
if (job.workflow !== 'create') {
|
|
26
|
+
const inputs = job.images.map((image) => ({ url: toDataUrl(image.bytes, image.mime), type: 'image_url' }));
|
|
27
|
+
if (inputs.length === 1)
|
|
28
|
+
body['image'] = inputs[0];
|
|
29
|
+
else if (inputs.length > 1)
|
|
30
|
+
body['images'] = inputs;
|
|
31
|
+
}
|
|
32
|
+
return body;
|
|
33
|
+
}
|
|
34
|
+
const isStrings = (value) => Array.isArray(value) && value.every((item) => typeof item === 'string');
|
|
35
|
+
/**
|
|
36
|
+
* The models of `GET /image-generation-models`: those that output images (when the entry says), able
|
|
37
|
+
* to edit and take references when they accept images.
|
|
38
|
+
*/
|
|
39
|
+
export function xaiImageModels(json) {
|
|
40
|
+
const list = json && typeof json === 'object' && !Array.isArray(json)
|
|
41
|
+
? (json['models'] ?? json['data'])
|
|
42
|
+
: undefined;
|
|
43
|
+
const out = [];
|
|
44
|
+
const seen = new Set();
|
|
45
|
+
for (const item of Array.isArray(list) ? list : []) {
|
|
46
|
+
if (!item || typeof item !== 'object')
|
|
47
|
+
continue;
|
|
48
|
+
const entry = item;
|
|
49
|
+
const id = entry['id'];
|
|
50
|
+
if (typeof id !== 'string' || id === '' || seen.has(id))
|
|
51
|
+
continue;
|
|
52
|
+
const outputs = entry['output_modalities'];
|
|
53
|
+
if (isStrings(outputs) && !outputs.some((m) => m.toLowerCase() === 'image'))
|
|
54
|
+
continue;
|
|
55
|
+
seen.add(id);
|
|
56
|
+
const inputs = entry['input_modalities'];
|
|
57
|
+
const takesImages = isStrings(inputs) && inputs.some((m) => m.toLowerCase() === 'image');
|
|
58
|
+
out.push({ id, workflows: takesImages ? ['create', 'edit', 'reference'] : ['create'] });
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
export const XAI_IMAGES = {
|
|
63
|
+
dialect: 'xai-images',
|
|
64
|
+
kind: 'image',
|
|
65
|
+
async listModels(ctx) {
|
|
66
|
+
const answer = await callProvider(ctx, joinUrl(ctx.baseUrl, '/image-generation-models'));
|
|
67
|
+
return xaiImageModels(answer.json);
|
|
68
|
+
},
|
|
69
|
+
async generate(ctx, job, report) {
|
|
70
|
+
if (!WORKFLOWS.includes(job.workflow))
|
|
71
|
+
throw remoteError('REMOTE_UNSUPPORTED', `${ctx.provider} does not support this workflow.`, job.workflow);
|
|
72
|
+
if (job.workflow !== 'create' && job.images.length === 0)
|
|
73
|
+
throw remoteError('REMOTE_UNSUPPORTED', 'This workflow needs a source image.', job.workflow);
|
|
74
|
+
report({ phase: 'generating' });
|
|
75
|
+
const path = job.workflow === 'create' ? '/images/generations' : '/images/edits';
|
|
76
|
+
const answer = await callProvider(ctx, joinUrl(ctx.baseUrl, path), {
|
|
77
|
+
json: xaiImageBody(job),
|
|
78
|
+
timeoutMs: GENERATE_TIMEOUT_MS,
|
|
79
|
+
});
|
|
80
|
+
return imagesFromAnswer(ctx, answer.json);
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=xai-images.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xai-images.js","sourceRoot":"","sources":["../../../src/media/adapters/xai-images.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `xai-videos`: xAI's Grok Imagine video API (registered base `https://api.x.ai/v1`).
|
|
3
|
+
*
|
|
4
|
+
* Every URL is derived from `ctx.baseUrl`:
|
|
5
|
+
* - submit: `POST {base}/videos/generations`, JSON `{model, prompt, duration, aspect_ratio,
|
|
6
|
+
* resolution, generate_audio, image: {url}, last_frame: {url}}` → `{request_id}`. Frames go as data
|
|
7
|
+
* URLs. xAI ignores `aspect_ratio` for image to video (the clip takes the image's).
|
|
8
|
+
* - poll: `GET {base}/videos/{request_id}` → `pending | done | failed | expired`, `progress` 0..100,
|
|
9
|
+
* `video: {url, duration, respect_moderation}`, `error: {code, message}`. A `done` clip that
|
|
10
|
+
* moderation withheld (`respect_moderation: false`, no URL) is `REMOTE_CONTENT_BLOCKED`.
|
|
11
|
+
* - download: `video.url`, a temporary file on xAI's CDN; off the API's origin it goes without the key.
|
|
12
|
+
* - models: `GET {base}/video-generation-models` → `{models: [{id}]}`.
|
|
13
|
+
*
|
|
14
|
+
* No cancel: xAI has none.
|
|
15
|
+
*/
|
|
16
|
+
import type { AtomicCoreError } from '../../contracts/index.js';
|
|
17
|
+
import type { LiveMediaModel } from '../catalog.js';
|
|
18
|
+
import type { VideoAdapter, VideoGenerationJob, VideoPoll } from './types.js';
|
|
19
|
+
type Fields = Record<string, unknown>;
|
|
20
|
+
/** The submit body: each field only when the job set it and the model offers it; frames as data URLs. */
|
|
21
|
+
export declare function xaiVideoBody(job: VideoGenerationJob, provider?: string): Fields;
|
|
22
|
+
/** A failed job's `error: {code, message}` as the closest `REMOTE_*` code. */
|
|
23
|
+
export declare function xaiVideoError(provider: string, error: unknown): AtomicCoreError;
|
|
24
|
+
/** One `GET {base}/videos/{request_id}` answer as a poll result. */
|
|
25
|
+
export declare function readXaiVideo(provider: string, json: unknown): VideoPoll;
|
|
26
|
+
/** The models of a `GET {base}/video-generation-models` answer. */
|
|
27
|
+
export declare function xaiVideoModels(json: unknown): LiveMediaModel[];
|
|
28
|
+
export declare const XAI_VIDEOS: VideoAdapter;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `xai-videos`: xAI's Grok Imagine video API (registered base `https://api.x.ai/v1`).
|
|
3
|
+
*
|
|
4
|
+
* Every URL is derived from `ctx.baseUrl`:
|
|
5
|
+
* - submit: `POST {base}/videos/generations`, JSON `{model, prompt, duration, aspect_ratio,
|
|
6
|
+
* resolution, generate_audio, image: {url}, last_frame: {url}}` → `{request_id}`. Frames go as data
|
|
7
|
+
* URLs. xAI ignores `aspect_ratio` for image to video (the clip takes the image's).
|
|
8
|
+
* - poll: `GET {base}/videos/{request_id}` → `pending | done | failed | expired`, `progress` 0..100,
|
|
9
|
+
* `video: {url, duration, respect_moderation}`, `error: {code, message}`. A `done` clip that
|
|
10
|
+
* moderation withheld (`respect_moderation: false`, no URL) is `REMOTE_CONTENT_BLOCKED`.
|
|
11
|
+
* - download: `video.url`, a temporary file on xAI's CDN; off the API's origin it goes without the key.
|
|
12
|
+
* - models: `GET {base}/video-generation-models` → `{models: [{id}]}`.
|
|
13
|
+
*
|
|
14
|
+
* No cancel: xAI has none.
|
|
15
|
+
*/
|
|
16
|
+
import { callProvider, downloadResult, joinUrl, MAX_VIDEO_BYTES, providerMessage, remoteError, sniffVideoMime, toDataUrl, } from '../http.js';
|
|
17
|
+
const isObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
18
|
+
const BLOCKED = /moderation|content[ _-]?polic|safety|nsfw|sensitive|prohibited|blocked|flagged/i;
|
|
19
|
+
/** The submit body: each field only when the job set it and the model offers it; frames as data URLs. */
|
|
20
|
+
export function xaiVideoBody(job, provider = 'xAI') {
|
|
21
|
+
const params = job.model.params;
|
|
22
|
+
const body = { model: job.model.id, prompt: job.prompt };
|
|
23
|
+
if (job.durationSecs !== undefined && params.durations)
|
|
24
|
+
body['duration'] = Math.round(job.durationSecs);
|
|
25
|
+
if (job.aspectRatio && params.aspect_ratios)
|
|
26
|
+
body['aspect_ratio'] = job.aspectRatio;
|
|
27
|
+
if (job.resolution && params.resolutions)
|
|
28
|
+
body['resolution'] = job.resolution;
|
|
29
|
+
if (job.generateAudio !== undefined && params.audio)
|
|
30
|
+
body['generate_audio'] = job.generateAudio;
|
|
31
|
+
if (job.seed !== undefined && params.seed)
|
|
32
|
+
body['seed'] = job.seed;
|
|
33
|
+
if (job.workflow === 'image-to-video') {
|
|
34
|
+
if (!job.firstFrame)
|
|
35
|
+
throw remoteError('REMOTE_UNSUPPORTED', 'Image to video needs a first frame.', job.workflow);
|
|
36
|
+
body['image'] = { url: toDataUrl(job.firstFrame.bytes, job.firstFrame.mime) };
|
|
37
|
+
if (job.lastFrame) {
|
|
38
|
+
if (!params.last_frame)
|
|
39
|
+
throw remoteError('REMOTE_UNSUPPORTED', `${provider} takes no last frame for this model.`, job.model.id);
|
|
40
|
+
body['last_frame'] = { url: toDataUrl(job.lastFrame.bytes, job.lastFrame.mime) };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return body;
|
|
44
|
+
}
|
|
45
|
+
/** A failed job's `error: {code, message}` as the closest `REMOTE_*` code. */
|
|
46
|
+
export function xaiVideoError(provider, error) {
|
|
47
|
+
const code = isObject(error) && typeof error['code'] === 'string' ? error['code'].toLowerCase() : '';
|
|
48
|
+
const said = providerMessage({ error });
|
|
49
|
+
const details = [code, said].filter(Boolean).join(': ') || undefined;
|
|
50
|
+
if (BLOCKED.test(said ?? ''))
|
|
51
|
+
return remoteError('REMOTE_CONTENT_BLOCKED', `${provider} refused the request: ${said}`, details);
|
|
52
|
+
if (code === 'invalid_argument' || code === 'failed_precondition')
|
|
53
|
+
return remoteError('REMOTE_REJECTED', said ? `${provider}: ${said}` : `${provider} refused the request.`, details);
|
|
54
|
+
if (code === 'permission_denied' || code === 'unauthenticated')
|
|
55
|
+
return remoteError('REMOTE_AUTH_FAILED', `${provider} refused the API key or the model.`, details);
|
|
56
|
+
if (code === 'resource_exhausted')
|
|
57
|
+
return remoteError('REMOTE_RATE_LIMITED', `${provider} is rate-limiting requests.`, details);
|
|
58
|
+
return remoteError('REMOTE_UNAVAILABLE', said ? `${provider} failed to make the clip: ${said}` : `${provider} failed to make the clip.`, details);
|
|
59
|
+
}
|
|
60
|
+
function progressOf(value) {
|
|
61
|
+
return typeof value === 'number' && Number.isFinite(value)
|
|
62
|
+
? { progress: Math.min(1, Math.max(0, value / 100)) }
|
|
63
|
+
: {};
|
|
64
|
+
}
|
|
65
|
+
/** One `GET {base}/videos/{request_id}` answer as a poll result. */
|
|
66
|
+
export function readXaiVideo(provider, json) {
|
|
67
|
+
const fields = isObject(json) ? json : {};
|
|
68
|
+
const status = typeof fields['status'] === 'string' ? fields['status'].toLowerCase() : '';
|
|
69
|
+
switch (status) {
|
|
70
|
+
case 'done':
|
|
71
|
+
case 'completed': {
|
|
72
|
+
const video = isObject(fields['video']) ? fields['video'] : {};
|
|
73
|
+
const url = typeof video['url'] === 'string' ? video['url'].trim() : '';
|
|
74
|
+
if (url !== '')
|
|
75
|
+
return { state: 'completed', result: { url } };
|
|
76
|
+
if (video['respect_moderation'] === false)
|
|
77
|
+
return {
|
|
78
|
+
state: 'failed',
|
|
79
|
+
error: remoteError('REMOTE_CONTENT_BLOCKED', `${provider} withheld the clip by moderation.`),
|
|
80
|
+
};
|
|
81
|
+
return {
|
|
82
|
+
state: 'failed',
|
|
83
|
+
error: remoteError('REMOTE_UNAVAILABLE', `${provider} finished without a clip.`),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
case 'failed':
|
|
87
|
+
return { state: 'failed', error: xaiVideoError(provider, fields['error']) };
|
|
88
|
+
case 'expired':
|
|
89
|
+
return {
|
|
90
|
+
state: 'failed',
|
|
91
|
+
error: remoteError('REMOTE_UNAVAILABLE', `${provider} let the clip expire before it was fetched.`),
|
|
92
|
+
};
|
|
93
|
+
default:
|
|
94
|
+
// `pending`: xAI does not tell a queue from a render.
|
|
95
|
+
return { state: 'running', ...progressOf(fields['progress']) };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** The models of a `GET {base}/video-generation-models` answer. */
|
|
99
|
+
export function xaiVideoModels(json) {
|
|
100
|
+
const fields = isObject(json) ? json : {};
|
|
101
|
+
const data = fields['models'] ?? fields['data'];
|
|
102
|
+
const out = [];
|
|
103
|
+
const seen = new Set();
|
|
104
|
+
for (const item of Array.isArray(data) ? data : []) {
|
|
105
|
+
if (!isObject(item) || typeof item['id'] !== 'string' || item['id'] === '' || seen.has(item['id']))
|
|
106
|
+
continue;
|
|
107
|
+
seen.add(item['id']);
|
|
108
|
+
out.push({ id: item['id'] });
|
|
109
|
+
}
|
|
110
|
+
return out;
|
|
111
|
+
}
|
|
112
|
+
export const XAI_VIDEOS = {
|
|
113
|
+
dialect: 'xai-videos',
|
|
114
|
+
kind: 'video',
|
|
115
|
+
pollIntervalMs: { first: 5_000, max: 15_000 },
|
|
116
|
+
async listModels(ctx) {
|
|
117
|
+
const answer = await callProvider(ctx, joinUrl(ctx.baseUrl, '/video-generation-models'), {
|
|
118
|
+
accept: [404],
|
|
119
|
+
});
|
|
120
|
+
return answer.status === 200 ? xaiVideoModels(answer.json) : [];
|
|
121
|
+
},
|
|
122
|
+
async submit(ctx, job) {
|
|
123
|
+
const body = xaiVideoBody(job, ctx.provider);
|
|
124
|
+
const answer = await callProvider(ctx, joinUrl(ctx.baseUrl, '/videos/generations'), { json: body });
|
|
125
|
+
const fields = isObject(answer.json) ? answer.json : {};
|
|
126
|
+
const id = fields['request_id'] ?? fields['id'];
|
|
127
|
+
if (typeof id !== 'string' || id === '')
|
|
128
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} answered without a request id.`, answer.text.slice(0, 500));
|
|
129
|
+
return { id };
|
|
130
|
+
},
|
|
131
|
+
async poll(ctx, submission) {
|
|
132
|
+
// 202 is how xAI's other deferred routes say "not yet"; take it as a pending job.
|
|
133
|
+
const answer = await callProvider(ctx, joinUrl(ctx.baseUrl, `/videos/${encodeURIComponent(submission.id)}`), {
|
|
134
|
+
accept: [202],
|
|
135
|
+
});
|
|
136
|
+
return readXaiVideo(ctx.provider, answer.json);
|
|
137
|
+
},
|
|
138
|
+
async download(ctx, _submission, result) {
|
|
139
|
+
if (!result.url)
|
|
140
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} gave no clip to download.`);
|
|
141
|
+
const file = await downloadResult(ctx, result.url, { maxBytes: MAX_VIDEO_BYTES, what: 'video' });
|
|
142
|
+
const mime = sniffVideoMime(file.bytes);
|
|
143
|
+
if (!mime)
|
|
144
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} returned a file that is not a video.`);
|
|
145
|
+
return { bytes: file.bytes, mime };
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=xai-videos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xai-videos.js","sourceRoot":"","sources":["../../../src/media/adapters/xai-videos.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Offline snapshot of atomic-chat-conf/providers/media.json (without `$schema`): what the core offers
|
|
2
|
+
// when neither the live catalog nor its disk cache are available. Re-copy it from conf when the
|
|
3
|
+
// catalog changes there; a live document with a newer `catalog_version` always wins.
|
|
4
|
+
import raw from './catalog-baseline.json' with { type: 'json' };
|
|
5
|
+
import { parseMediaCatalog } from './catalog.js';
|
|
6
|
+
const parsed = parseMediaCatalog(raw);
|
|
7
|
+
if (!parsed)
|
|
8
|
+
throw new Error('catalog-baseline.json is not a valid remote media catalog');
|
|
9
|
+
export const MEDIA_CATALOG_BASELINE = parsed;
|
|
10
|
+
//# sourceMappingURL=catalog-baseline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-baseline.js","sourceRoot":"","sources":["../../src/media/catalog-baseline.ts"],"names":[],"mappings":"AAAA,sGAAsG;AACtG,gGAAgG;AAChG,qFAAqF;AACrF,OAAO,GAAG,MAAM,yBAAyB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAGhD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;AACrC,IAAI,CAAC,MAAM;IAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;AAEzF,MAAM,CAAC,MAAM,sBAAsB,GAAiB,MAAM,CAAA"}
|