@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,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `hf-videos`: Hugging Face Inference Providers' video models, through fal-ai's queue behind the HF
|
|
3
|
+
* router. The provider is registered with the router's OpenAI-compatible base
|
|
4
|
+
* (`https://router.huggingface.co/v1`); the router proxies each inference provider under
|
|
5
|
+
* `/{provider}` of its origin, so `hfRouterBase` strips the trailing `/v1` and every call goes to
|
|
6
|
+
* `{router}/fal-ai/…?_subdomain=queue`, the way huggingface.js routes fal-ai's queue
|
|
7
|
+
* (`packages/inference/src/providers/fal-ai.ts`). The HF token never goes to `queue.fal.run` itself.
|
|
8
|
+
*
|
|
9
|
+
* A catalog model names its route in `options`: `hf_provider` (`fal-ai`, the only one spoken here)
|
|
10
|
+
* and `provider_model` (fal's endpoint id, e.g. `fal-ai/wan/v2.2-5b/text-to-video`).
|
|
11
|
+
*
|
|
12
|
+
* - submit → `POST {router}/fal-ai/{provider_model}?_subdomain=queue` `{prompt, …}` →
|
|
13
|
+
* `{request_id, response_url, status_url}`. fal's URLs point at `queue.fal.run`; only their path
|
|
14
|
+
* (`/{owner}/{app}/requests/{id}`) is kept, to be asked through the router later;
|
|
15
|
+
* - poll → `GET {router}/fal-ai{path}/status?_subdomain=queue` → `status` IN_QUEUE | IN_PROGRESS |
|
|
16
|
+
* COMPLETED (with `error`/`error_type` when it failed); once completed, `GET
|
|
17
|
+
* {router}/fal-ai{path}?_subdomain=queue` → `{video:{url}}`;
|
|
18
|
+
* - download → `video.url` on fal's CDN, without the key;
|
|
19
|
+
* - no cancel; the listing is the public Hub API (no key), and only for the real router.
|
|
20
|
+
*/
|
|
21
|
+
import { callProvider, downloadResult, MAX_VIDEO_BYTES, networkError, providerMessage, remoteError, remoteHttpError, SHORT_TIMEOUT_MS, sniffVideoMime, toDataUrl, } from '../http.js';
|
|
22
|
+
const fields = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
23
|
+
const textOf = (value) => typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;
|
|
24
|
+
/** The only inference provider this adapter speaks. */
|
|
25
|
+
const FAL_AI = 'fal-ai';
|
|
26
|
+
/** The router asks fal's queue (not its synchronous endpoint) with this. */
|
|
27
|
+
const QUEUE = '?_subdomain=queue';
|
|
28
|
+
/** The host whose models the public Hub lists. */
|
|
29
|
+
const HF_ROUTER_HOST = 'router.huggingface.co';
|
|
30
|
+
/** The Hub's text-to-video models served by fal-ai, with their provider mappings. */
|
|
31
|
+
export const HF_VIDEO_LISTING_URL = 'https://huggingface.co/api/models?inference_provider=fal-ai&pipeline_tag=text-to-video&expand[]=inferenceProviderMapping&limit=100';
|
|
32
|
+
/** A fal endpoint id: `owner/app[/sub/path]`, no empty or dot segments. */
|
|
33
|
+
const ENDPOINT_ID = /^[A-Za-z0-9_-][\w.-]*(\/[A-Za-z0-9_-][\w.-]*)+$/;
|
|
34
|
+
/** A queued request's path: `/{owner}/{app}[/…]/requests/{id}`, no dot segments. */
|
|
35
|
+
const QUEUE_PATH = /^(\/(?!\.{1,2}(\/|$))[^/?#]+){2,}\/requests\/[\w-]+$/;
|
|
36
|
+
/** `https://router.huggingface.co/v1` → `https://router.huggingface.co`. */
|
|
37
|
+
export function hfRouterBase(baseUrl) {
|
|
38
|
+
return baseUrl.replace(/\/+$/, '').replace(/\/v1$/, '');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The queue path of a submitted request, `/{owner}/{app}/requests/{id}`: the path of fal's
|
|
42
|
+
* `response_url` (or `status_url`), as huggingface.js takes it, else built from the endpoint id the
|
|
43
|
+
* way fal's own client does (its first two segments).
|
|
44
|
+
*/
|
|
45
|
+
export function falRequestPath(answer, providerModel, requestId) {
|
|
46
|
+
const body = fields(answer);
|
|
47
|
+
const tail = `/requests/${requestId}`;
|
|
48
|
+
for (const key of ['response_url', 'status_url']) {
|
|
49
|
+
const raw = textOf(body[key]);
|
|
50
|
+
if (!raw)
|
|
51
|
+
continue;
|
|
52
|
+
let url;
|
|
53
|
+
try {
|
|
54
|
+
url = new URL(raw);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
let path = url.pathname.replace(/\/status$/, '');
|
|
60
|
+
// A URL the router already rewrote carries its `/fal-ai` prefix; the path is fal's own.
|
|
61
|
+
if (!url.hostname.endsWith('fal.run') && path.startsWith(`/${FAL_AI}/`))
|
|
62
|
+
path = path.slice(FAL_AI.length + 1);
|
|
63
|
+
if (path.endsWith(tail) && QUEUE_PATH.test(path))
|
|
64
|
+
return path;
|
|
65
|
+
}
|
|
66
|
+
const [owner, app] = providerModel.split('/');
|
|
67
|
+
return `/${owner}/${app}${tail}`;
|
|
68
|
+
}
|
|
69
|
+
/** A fal failure (`error`/`error_type` of a completed request, or its result's error body). */
|
|
70
|
+
export function falError(provider, body, status, text = '') {
|
|
71
|
+
const fieldsOf = fields(body);
|
|
72
|
+
const types = [fieldsOf['error_type'], fieldsOf['type']];
|
|
73
|
+
const detail = fieldsOf['detail'];
|
|
74
|
+
if (Array.isArray(detail))
|
|
75
|
+
for (const item of detail)
|
|
76
|
+
types.push(fields(item)['type']);
|
|
77
|
+
const typed = types.filter((t) => typeof t === 'string');
|
|
78
|
+
const said = providerMessage(body, text);
|
|
79
|
+
const details = [status === undefined ? undefined : `HTTP ${status}`, typed[0], said]
|
|
80
|
+
.filter(Boolean)
|
|
81
|
+
.join(': ');
|
|
82
|
+
if (typed.some((t) => /content_policy|nsfw|safety|moderation/i.test(t)))
|
|
83
|
+
return remoteError('REMOTE_CONTENT_BLOCKED', said ? `${provider} refused the content: ${said}` : `${provider} refused the content.`, details || undefined);
|
|
84
|
+
if (status !== undefined)
|
|
85
|
+
return remoteHttpError(provider, status, body, text);
|
|
86
|
+
if (typed.some((t) => /timeout/i.test(t)))
|
|
87
|
+
return remoteError('REMOTE_TIMEOUT', `${provider} took too long to make the clip.`, details || undefined);
|
|
88
|
+
return remoteError('REMOTE_UNAVAILABLE', said ? `${provider} could not make the clip: ${said}` : `${provider} could not make the clip.`, details || undefined);
|
|
89
|
+
}
|
|
90
|
+
/** The workflow is the model's, and image to video has the frames it needs. */
|
|
91
|
+
function checkInputs(job) {
|
|
92
|
+
if (!job.model.workflows.includes(job.workflow))
|
|
93
|
+
throw remoteError('REMOTE_UNSUPPORTED', `${job.model.name} cannot do ${job.workflow}.`, job.workflow);
|
|
94
|
+
if (job.workflow !== 'image-to-video')
|
|
95
|
+
return;
|
|
96
|
+
if (!job.firstFrame)
|
|
97
|
+
throw remoteError('REMOTE_UNSUPPORTED', 'Image to video needs a first frame.');
|
|
98
|
+
if (job.lastFrame && !job.model.params.last_frame)
|
|
99
|
+
throw remoteError('REMOTE_UNSUPPORTED', `${job.model.name} does not take a last frame.`);
|
|
100
|
+
}
|
|
101
|
+
/** Where a model runs: its fal endpoint id, or `REMOTE_UNSUPPORTED` for a model without one. */
|
|
102
|
+
export function falEndpoint(job) {
|
|
103
|
+
const options = job.model.options ?? {};
|
|
104
|
+
const provider = options['hf_provider'] ?? FAL_AI;
|
|
105
|
+
if (provider !== FAL_AI)
|
|
106
|
+
throw remoteError('REMOTE_UNSUPPORTED', `${job.model.name} runs on ${String(provider)}, which is not supported.`);
|
|
107
|
+
const endpoint = options['provider_model'];
|
|
108
|
+
if (typeof endpoint !== 'string' || !ENDPOINT_ID.test(endpoint))
|
|
109
|
+
throw remoteError('REMOTE_UNSUPPORTED', `${job.model.name} names no fal-ai model to run on.`, job.model.id);
|
|
110
|
+
return endpoint;
|
|
111
|
+
}
|
|
112
|
+
/** fal's input: what the job set and the model offers. */
|
|
113
|
+
export function falVideoInput(job) {
|
|
114
|
+
checkInputs(job);
|
|
115
|
+
const params = job.model.params;
|
|
116
|
+
const input = { prompt: job.prompt };
|
|
117
|
+
if (job.negativePrompt && params.negative_prompt)
|
|
118
|
+
input['negative_prompt'] = job.negativePrompt;
|
|
119
|
+
if (job.aspectRatio && params.aspect_ratios)
|
|
120
|
+
input['aspect_ratio'] = job.aspectRatio;
|
|
121
|
+
if (job.resolution && params.resolutions)
|
|
122
|
+
input['resolution'] = job.resolution;
|
|
123
|
+
if (job.durationSecs !== undefined && params.durations)
|
|
124
|
+
input['duration'] = Math.round(job.durationSecs);
|
|
125
|
+
if (job.generateAudio !== undefined && params.audio)
|
|
126
|
+
input['generate_audio'] = job.generateAudio;
|
|
127
|
+
if (job.seed !== undefined && params.seed)
|
|
128
|
+
input['seed'] = job.seed;
|
|
129
|
+
if (job.workflow === 'image-to-video' && job.firstFrame) {
|
|
130
|
+
input['image_url'] = toDataUrl(job.firstFrame.bytes, job.firstFrame.mime);
|
|
131
|
+
if (job.lastFrame)
|
|
132
|
+
input['end_image_url'] = toDataUrl(job.lastFrame.bytes, job.lastFrame.mime);
|
|
133
|
+
}
|
|
134
|
+
return input;
|
|
135
|
+
}
|
|
136
|
+
/** The Hub's listing as models: a live fal-ai mapping of a single model each. */
|
|
137
|
+
export function falVideoModels(json) {
|
|
138
|
+
const out = [];
|
|
139
|
+
const seen = new Set();
|
|
140
|
+
for (const item of Array.isArray(json) ? json : []) {
|
|
141
|
+
const entry = fields(item);
|
|
142
|
+
const id = textOf(entry['id']) ?? textOf(entry['modelId']);
|
|
143
|
+
if (!id || seen.has(id))
|
|
144
|
+
continue;
|
|
145
|
+
const raw = entry['inferenceProviderMapping'];
|
|
146
|
+
// The Hub answers a list of mappings; older answers keyed them by provider.
|
|
147
|
+
const mappings = Array.isArray(raw)
|
|
148
|
+
? raw.map(fields)
|
|
149
|
+
: Object.entries(fields(raw)).map(([provider, value]) => ({ provider, ...fields(value) }));
|
|
150
|
+
const fal = mappings.find((m) => m['provider'] === FAL_AI &&
|
|
151
|
+
m['status'] === 'live' &&
|
|
152
|
+
(m['task'] === undefined || m['task'] === 'text-to-video') &&
|
|
153
|
+
(m['type'] === undefined || m['type'] === 'single-model') &&
|
|
154
|
+
typeof m['providerId'] === 'string' &&
|
|
155
|
+
ENDPOINT_ID.test(m['providerId']));
|
|
156
|
+
if (!fal)
|
|
157
|
+
continue;
|
|
158
|
+
seen.add(id);
|
|
159
|
+
out.push({
|
|
160
|
+
id,
|
|
161
|
+
workflows: ['create'],
|
|
162
|
+
options: { hf_provider: FAL_AI, provider_model: fal['providerId'] },
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return out;
|
|
166
|
+
}
|
|
167
|
+
/** The router URL of a queued request, from its persisted path. */
|
|
168
|
+
function queueUrl(ctx, path, suffix = '') {
|
|
169
|
+
return `${hfRouterBase(ctx.baseUrl)}/${FAL_AI}${path}${suffix}${QUEUE}`;
|
|
170
|
+
}
|
|
171
|
+
/** The persisted queue path, checked: it goes to the router with the key. */
|
|
172
|
+
function pathOf(submission) {
|
|
173
|
+
const path = submission.data?.['path'];
|
|
174
|
+
if (typeof path === 'string' && QUEUE_PATH.test(path))
|
|
175
|
+
return path;
|
|
176
|
+
throw remoteError('REMOTE_UNAVAILABLE', 'The submitted request has no queue path to ask.', submission.id);
|
|
177
|
+
}
|
|
178
|
+
/** Statuses of the result fetch that end the job rather than the poll. */
|
|
179
|
+
const RESULT_REFUSALS = [400, 404, 410, 422];
|
|
180
|
+
async function completed(ctx, path) {
|
|
181
|
+
const answer = await callProvider(ctx, queueUrl(ctx, path), { accept: RESULT_REFUSALS });
|
|
182
|
+
if (answer.status >= 300)
|
|
183
|
+
return { state: 'failed', error: falError(ctx.provider, answer.json, answer.status, answer.text) };
|
|
184
|
+
const url = textOf(fields(fields(answer.json)['video'])['url']);
|
|
185
|
+
if (!url)
|
|
186
|
+
return {
|
|
187
|
+
state: 'failed',
|
|
188
|
+
error: remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} finished without a clip.`),
|
|
189
|
+
};
|
|
190
|
+
return { state: 'completed', result: { url } };
|
|
191
|
+
}
|
|
192
|
+
export const HF_VIDEOS = {
|
|
193
|
+
dialect: 'hf-videos',
|
|
194
|
+
kind: 'video',
|
|
195
|
+
pollIntervalMs: { first: 5000, max: 15000 },
|
|
196
|
+
async listModels(ctx) {
|
|
197
|
+
// The Hub lists the router's models; a base elsewhere (a proxy) has the catalog alone.
|
|
198
|
+
let host;
|
|
199
|
+
try {
|
|
200
|
+
host = new URL(ctx.baseUrl).hostname;
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return [];
|
|
204
|
+
}
|
|
205
|
+
if (host !== HF_ROUTER_HOST)
|
|
206
|
+
return [];
|
|
207
|
+
// A public listing on another origin: neither the key nor custom headers go along.
|
|
208
|
+
let response;
|
|
209
|
+
let text;
|
|
210
|
+
try {
|
|
211
|
+
response = await ctx.fetch(HF_VIDEO_LISTING_URL, {
|
|
212
|
+
headers: { Accept: 'application/json' },
|
|
213
|
+
signal: AbortSignal.any([ctx.signal, AbortSignal.timeout(SHORT_TIMEOUT_MS)]),
|
|
214
|
+
});
|
|
215
|
+
text = await response.text();
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
throw networkError(ctx, error);
|
|
219
|
+
}
|
|
220
|
+
let json;
|
|
221
|
+
try {
|
|
222
|
+
json = JSON.parse(text);
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
json = undefined;
|
|
226
|
+
}
|
|
227
|
+
if (!response.ok)
|
|
228
|
+
throw remoteHttpError(ctx.provider, response.status, json, text);
|
|
229
|
+
return falVideoModels(json);
|
|
230
|
+
},
|
|
231
|
+
async submit(ctx, job) {
|
|
232
|
+
const endpoint = falEndpoint(job);
|
|
233
|
+
const answer = await callProvider(ctx, `${hfRouterBase(ctx.baseUrl)}/${FAL_AI}/${endpoint}${QUEUE}`, {
|
|
234
|
+
json: falVideoInput(job),
|
|
235
|
+
});
|
|
236
|
+
const body = fields(answer.json);
|
|
237
|
+
const id = textOf(body['request_id']);
|
|
238
|
+
if (!id || !/^[\w-]+$/.test(id))
|
|
239
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} answered without a request id.`);
|
|
240
|
+
return { id, data: { path: falRequestPath(body, endpoint, id) } };
|
|
241
|
+
},
|
|
242
|
+
async poll(ctx, submission) {
|
|
243
|
+
const path = pathOf(submission);
|
|
244
|
+
const answer = await callProvider(ctx, queueUrl(ctx, path, '/status'));
|
|
245
|
+
const body = fields(answer.json);
|
|
246
|
+
const status = (textOf(body['status']) ?? '').toUpperCase();
|
|
247
|
+
if (status === 'IN_QUEUE')
|
|
248
|
+
return { state: 'queued' };
|
|
249
|
+
if (status !== 'COMPLETED')
|
|
250
|
+
return { state: 'running' };
|
|
251
|
+
if (body['error'] !== undefined && body['error'] !== null)
|
|
252
|
+
return { state: 'failed', error: falError(ctx.provider, body) };
|
|
253
|
+
return completed(ctx, path);
|
|
254
|
+
},
|
|
255
|
+
async download(ctx, _submission, result) {
|
|
256
|
+
if (!result.url)
|
|
257
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} gave no clip to download.`);
|
|
258
|
+
const file = await downloadResult(ctx, result.url, { maxBytes: MAX_VIDEO_BYTES, what: 'video' });
|
|
259
|
+
const mime = sniffVideoMime(file.bytes);
|
|
260
|
+
if (!mime)
|
|
261
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} returned a file that is not a video.`, file.mime || undefined);
|
|
262
|
+
return { bytes: file.bytes, mime };
|
|
263
|
+
},
|
|
264
|
+
};
|
|
265
|
+
//# sourceMappingURL=hf-videos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hf-videos.js","sourceRoot":"","sources":["../../../src/media/adapters/hf-videos.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `minimax-image`: MiniMax's image API (`image-01`), registered with base `https://api.minimax.io/v1`,
|
|
3
|
+
* Bearer key.
|
|
4
|
+
*
|
|
5
|
+
* Every workflow is `POST {base}/image_generation` (the registered base joined to the path):
|
|
6
|
+
* `create` from the prompt, `reference` with the first input as a character `subject_reference`.
|
|
7
|
+
* MiniMax cannot edit an image or take a mask, so the other workflows are refused. We ask for
|
|
8
|
+
* `base64`; `image_urls` are taken too. MiniMax answers most failures as HTTP 200 with a non-zero
|
|
9
|
+
* `base_resp.status_code`, mapped here. It has no model listing: the catalog alone applies.
|
|
10
|
+
*/
|
|
11
|
+
import type { AtomicCoreError } from '../../contracts/index.js';
|
|
12
|
+
import type { MediaContext } from '../http.js';
|
|
13
|
+
import type { GeneratedImage, ImageAdapter, ImageGenerationJob } from './types.js';
|
|
14
|
+
/** The JSON body of `POST /image_generation`. */
|
|
15
|
+
export declare function minimaxImageBody(job: ImageGenerationJob): Record<string, unknown>;
|
|
16
|
+
/**
|
|
17
|
+
* The `REMOTE_*` error a non-zero `base_resp.status_code` means (MiniMax answers those with HTTP
|
|
18
|
+
* 200); `undefined` when the body says the call succeeded or says nothing.
|
|
19
|
+
*/
|
|
20
|
+
export declare function minimaxImageStatusError(provider: string, json: unknown): AtomicCoreError | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* The images of an `/image_generation` answer (base64, or URLs downloaded), or the error it amounts
|
|
23
|
+
* to: a status code, or every image held back by the safety check (`metadata.failed_count`).
|
|
24
|
+
*/
|
|
25
|
+
export declare function minimaxImages(ctx: MediaContext, json: unknown): Promise<GeneratedImage[]>;
|
|
26
|
+
export declare const MINIMAX_IMAGE: ImageAdapter;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `minimax-image`: MiniMax's image API (`image-01`), registered with base `https://api.minimax.io/v1`,
|
|
3
|
+
* Bearer key.
|
|
4
|
+
*
|
|
5
|
+
* Every workflow is `POST {base}/image_generation` (the registered base joined to the path):
|
|
6
|
+
* `create` from the prompt, `reference` with the first input as a character `subject_reference`.
|
|
7
|
+
* MiniMax cannot edit an image or take a mask, so the other workflows are refused. We ask for
|
|
8
|
+
* `base64`; `image_urls` are taken too. MiniMax answers most failures as HTTP 200 with a non-zero
|
|
9
|
+
* `base_resp.status_code`, mapped here. It has no model listing: the catalog alone applies.
|
|
10
|
+
*/
|
|
11
|
+
import { callProvider, decodeBase64Image, downloadResult, GENERATE_TIMEOUT_MS, joinUrl, MAX_IMAGE_BYTES, parseWxH, remoteError, sniffImageMime, toDataUrl, } from '../http.js';
|
|
12
|
+
const WORKFLOWS = ['create', 'reference'];
|
|
13
|
+
const isObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
14
|
+
/** The JSON body of `POST /image_generation`. */
|
|
15
|
+
export function minimaxImageBody(job) {
|
|
16
|
+
const body = { model: job.model.id, prompt: job.prompt };
|
|
17
|
+
if (job.aspectRatio)
|
|
18
|
+
body['aspect_ratio'] = job.aspectRatio;
|
|
19
|
+
else {
|
|
20
|
+
// Used only without an aspect ratio, which MiniMax would put first.
|
|
21
|
+
const size = job.width && job.height ? { width: job.width, height: job.height } : parseWxH(job.size);
|
|
22
|
+
if (size) {
|
|
23
|
+
body['width'] = size.width;
|
|
24
|
+
body['height'] = size.height;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
body['response_format'] = 'base64';
|
|
28
|
+
if (job.seed !== undefined && job.model.params.seed)
|
|
29
|
+
body['seed'] = job.seed;
|
|
30
|
+
if (job.n > 1)
|
|
31
|
+
body['n'] = job.n;
|
|
32
|
+
body['prompt_optimizer'] = false;
|
|
33
|
+
const subject = job.images[0];
|
|
34
|
+
if (job.workflow === 'reference' && subject)
|
|
35
|
+
body['subject_reference'] = [{ type: 'character', image_file: toDataUrl(subject.bytes, subject.mime) }];
|
|
36
|
+
return body;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The `REMOTE_*` error a non-zero `base_resp.status_code` means (MiniMax answers those with HTTP
|
|
40
|
+
* 200); `undefined` when the body says the call succeeded or says nothing.
|
|
41
|
+
*/
|
|
42
|
+
export function minimaxImageStatusError(provider, json) {
|
|
43
|
+
const base = isObject(json) && isObject(json['base_resp']) ? json['base_resp'] : undefined;
|
|
44
|
+
const code = base?.['status_code'];
|
|
45
|
+
if (typeof code !== 'number' || code === 0)
|
|
46
|
+
return undefined;
|
|
47
|
+
const said = typeof base?.['status_msg'] === 'string' && base['status_msg'] !== '' ? base['status_msg'] : undefined;
|
|
48
|
+
const details = `status_code ${code}${said ? `: ${said}` : ''}`;
|
|
49
|
+
switch (code) {
|
|
50
|
+
case 1002:
|
|
51
|
+
return remoteError('REMOTE_RATE_LIMITED', `${provider} is rate-limiting requests.`, details);
|
|
52
|
+
case 1004:
|
|
53
|
+
case 2049:
|
|
54
|
+
return remoteError('REMOTE_AUTH_FAILED', `${provider} refused the API key.`, details);
|
|
55
|
+
case 1008:
|
|
56
|
+
return remoteError('REMOTE_QUOTA', `${provider} says the account is out of credit.`, details);
|
|
57
|
+
case 1026:
|
|
58
|
+
case 1027:
|
|
59
|
+
return remoteError('REMOTE_CONTENT_BLOCKED', `${provider} refused the request: ${said ?? 'sensitive content'}`, details);
|
|
60
|
+
case 2013:
|
|
61
|
+
return remoteError('REMOTE_REJECTED', said ? `${provider}: ${said}` : `${provider} refused the request.`, details);
|
|
62
|
+
default:
|
|
63
|
+
return remoteError('REMOTE_UNAVAILABLE', `${provider} failed to answer.`, details);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** A file the provider pointed at, with the type its bytes say. Local: `http.ts` has no such helper. */
|
|
67
|
+
async function downloadImage(ctx, url) {
|
|
68
|
+
const file = await downloadResult(ctx, url, { maxBytes: MAX_IMAGE_BYTES, what: 'image' });
|
|
69
|
+
const mime = sniffImageMime(file.bytes);
|
|
70
|
+
if (!mime)
|
|
71
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} returned a file that is not an image.`);
|
|
72
|
+
return { bytes: file.bytes, mime };
|
|
73
|
+
}
|
|
74
|
+
const strings = (value) => Array.isArray(value) ? value.filter((item) => typeof item === 'string' && item !== '') : [];
|
|
75
|
+
/**
|
|
76
|
+
* The images of an `/image_generation` answer (base64, or URLs downloaded), or the error it amounts
|
|
77
|
+
* to: a status code, or every image held back by the safety check (`metadata.failed_count`).
|
|
78
|
+
*/
|
|
79
|
+
export async function minimaxImages(ctx, json) {
|
|
80
|
+
const failed = minimaxImageStatusError(ctx.provider, json);
|
|
81
|
+
if (failed)
|
|
82
|
+
throw failed;
|
|
83
|
+
const data = isObject(json) && isObject(json['data']) ? json['data'] : {};
|
|
84
|
+
const out = strings(data['image_base64']).map((payload) => decodeBase64Image(payload));
|
|
85
|
+
for (const url of strings(data['image_urls']))
|
|
86
|
+
out.push(await downloadImage(ctx, url));
|
|
87
|
+
if (out.length > 0)
|
|
88
|
+
return out;
|
|
89
|
+
const metadata = isObject(json) && isObject(json['metadata']) ? json['metadata'] : {};
|
|
90
|
+
const blocked = Number(metadata['failed_count'] ?? 0);
|
|
91
|
+
if (blocked > 0)
|
|
92
|
+
throw remoteError('REMOTE_CONTENT_BLOCKED', `${ctx.provider} held back the image for its content.`, `failed_count ${blocked}`);
|
|
93
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} answered without an image.`);
|
|
94
|
+
}
|
|
95
|
+
export const MINIMAX_IMAGE = {
|
|
96
|
+
dialect: 'minimax-image',
|
|
97
|
+
kind: 'image',
|
|
98
|
+
async generate(ctx, job, report) {
|
|
99
|
+
if (!WORKFLOWS.includes(job.workflow))
|
|
100
|
+
throw remoteError('REMOTE_UNSUPPORTED', `${ctx.provider} does not support this workflow.`, job.workflow);
|
|
101
|
+
if (job.workflow === 'reference' && job.images.length === 0)
|
|
102
|
+
throw remoteError('REMOTE_UNSUPPORTED', 'This workflow needs a reference image.', job.workflow);
|
|
103
|
+
report({ phase: 'generating' });
|
|
104
|
+
const answer = await callProvider(ctx, joinUrl(ctx.baseUrl, '/image_generation'), {
|
|
105
|
+
json: minimaxImageBody(job),
|
|
106
|
+
timeoutMs: GENERATE_TIMEOUT_MS,
|
|
107
|
+
});
|
|
108
|
+
return minimaxImages(ctx, answer.json);
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=minimax-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimax-image.js","sourceRoot":"","sources":["../../../src/media/adapters/minimax-image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `minimax-video-v2`: MiniMax's V2 video API (MiniMax H3, H3 Max). The provider is registered with its
|
|
3
|
+
* V1 base (`https://api.minimax.io/v1`); V2 lives next to it, so `minimaxV2Base` swaps the trailing
|
|
4
|
+
* `/v1` for `/v2` (`https://api.minimax.io/v2`).
|
|
5
|
+
*
|
|
6
|
+
* - submit → `POST {v2}/video_generation` `{model, content, resolution, duration, ratio}`, where
|
|
7
|
+
* `content` is the prompt as a `text` item and the frames as `image_url` items with a
|
|
8
|
+
* `first_frame`/`last_frame` role; `resolution` and `duration` are required, and text to video
|
|
9
|
+
* needs a concrete `ratio` (image to video follows the frame) → `{task_id}`;
|
|
10
|
+
* - poll → `GET {v2}/query/video_generation/{task_id}` → `task.status` queued | running | succeeded |
|
|
11
|
+
* failed | cancelled, `task.content.url` once it succeeded, `task.error {code, message}` once it
|
|
12
|
+
* failed;
|
|
13
|
+
* - download → `task.content.url`, time-limited; an expired link is refreshed by asking again;
|
|
14
|
+
* - cancel → `DELETE {v2}/video_generation/{task_id}` (only a queued task; errors are ignored).
|
|
15
|
+
*
|
|
16
|
+
* V2 answers real HTTP statuses with an OpenAI-style error body; 422 is a content refusal.
|
|
17
|
+
*/
|
|
18
|
+
import type { AtomicCoreError } from '../../contracts/index.js';
|
|
19
|
+
import type { VideoAdapter, VideoGenerationJob } from './types.js';
|
|
20
|
+
type Fields = Record<string, unknown>;
|
|
21
|
+
/** The V2 base next to the registered V1 one: `…/v1` → `…/v2`; a base without a version gets `/v2`. */
|
|
22
|
+
export declare function minimaxV2Base(baseUrl: string): string;
|
|
23
|
+
/** A V2 non-2xx answer as a `REMOTE_*` error: 422 and a 1026/1027 message are content refusals. */
|
|
24
|
+
export declare function minimaxV2HttpError(provider: string, status: number, body: unknown, text?: string): AtomicCoreError;
|
|
25
|
+
/** A failed task's `error {code, message}` as a `REMOTE_*` error. */
|
|
26
|
+
export declare function minimaxTaskError(provider: string, error: unknown): AtomicCoreError;
|
|
27
|
+
/**
|
|
28
|
+
* The `POST /video_generation` body. `resolution` and `duration` are required, so the model's
|
|
29
|
+
* defaults fill in what the job left out; text to video takes the job's ratio or the model's default
|
|
30
|
+
* (`16:9` without one), image to video none.
|
|
31
|
+
*/
|
|
32
|
+
export declare function minimaxV2Body(job: VideoGenerationJob): Fields;
|
|
33
|
+
export declare const MINIMAX_VIDEO_V2: VideoAdapter;
|
|
34
|
+
export {};
|