@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,191 @@
|
|
|
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 { callProvider, downloadResult, MAX_VIDEO_BYTES, providerMessage, remoteError, remoteHttpError, sniffVideoMime, toDataUrl, } from '../http.js';
|
|
19
|
+
import { minimaxCodeError } from './minimax-video.js';
|
|
20
|
+
const fields = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
21
|
+
const textOf = (value) => typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;
|
|
22
|
+
/** A content refusal the provider names by MiniMax's code in its message: `... (1026)`. */
|
|
23
|
+
const BLOCKED_CODE = /\((1026|1027)\)/;
|
|
24
|
+
/** The V2 base next to the registered V1 one: `…/v1` → `…/v2`; a base without a version gets `/v2`. */
|
|
25
|
+
export function minimaxV2Base(baseUrl) {
|
|
26
|
+
const trimmed = baseUrl.replace(/\/+$/, '');
|
|
27
|
+
if (/\/v2$/.test(trimmed))
|
|
28
|
+
return trimmed;
|
|
29
|
+
if (/\/v1$/.test(trimmed))
|
|
30
|
+
return trimmed.replace(/\/v1$/, '/v2');
|
|
31
|
+
return `${trimmed}/v2`;
|
|
32
|
+
}
|
|
33
|
+
/** A V2 non-2xx answer as a `REMOTE_*` error: 422 and a 1026/1027 message are content refusals. */
|
|
34
|
+
export function minimaxV2HttpError(provider, status, body, text = '') {
|
|
35
|
+
const said = providerMessage(body, text);
|
|
36
|
+
if (status === 422 || (said && BLOCKED_CODE.test(said)))
|
|
37
|
+
return remoteError('REMOTE_CONTENT_BLOCKED', said ? `${provider} refused the content: ${said}` : `${provider} refused the content.`, `HTTP ${status}${said ? `: ${said}` : ''}`);
|
|
38
|
+
return remoteHttpError(provider, status, body, text);
|
|
39
|
+
}
|
|
40
|
+
/** A failed task's `error {code, message}` as a `REMOTE_*` error. */
|
|
41
|
+
export function minimaxTaskError(provider, error) {
|
|
42
|
+
const said = textOf(fields(error)['message']);
|
|
43
|
+
const raw = fields(error)['code'];
|
|
44
|
+
const code = typeof raw === 'number' ? raw : typeof raw === 'string' && /^\d+$/.test(raw.trim()) ? Number(raw) : NaN;
|
|
45
|
+
if (Number.isFinite(code))
|
|
46
|
+
return minimaxCodeError(provider, code, said);
|
|
47
|
+
// No numeric code: the same words-based reading as an HTTP refusal.
|
|
48
|
+
if (said) {
|
|
49
|
+
const mapped = remoteHttpError(provider, 400, { message: said });
|
|
50
|
+
if (mapped.code === 'REMOTE_CONTENT_BLOCKED')
|
|
51
|
+
return mapped;
|
|
52
|
+
}
|
|
53
|
+
return remoteError('REMOTE_UNAVAILABLE', said ? `${provider} could not make the clip: ${said}` : `${provider} could not make the clip.`, typeof raw === 'string' ? raw : undefined);
|
|
54
|
+
}
|
|
55
|
+
/** One V2 request: a 400 or 422 read with `minimaxV2HttpError`, other statuses as `callProvider` does. */
|
|
56
|
+
async function callV2(ctx, url, options = {}) {
|
|
57
|
+
const answer = await callProvider(ctx, url, { ...options, accept: [400, 422] });
|
|
58
|
+
if (answer.status === 400 || answer.status === 422)
|
|
59
|
+
throw minimaxV2HttpError(ctx.provider, answer.status, answer.json, answer.text);
|
|
60
|
+
return fields(answer.json);
|
|
61
|
+
}
|
|
62
|
+
/** The workflow is the model's, and image to video has the frames it needs. */
|
|
63
|
+
function checkInputs(job) {
|
|
64
|
+
if (!job.model.workflows.includes(job.workflow))
|
|
65
|
+
throw remoteError('REMOTE_UNSUPPORTED', `${job.model.name} cannot do ${job.workflow}.`, job.workflow);
|
|
66
|
+
if (job.workflow !== 'image-to-video')
|
|
67
|
+
return;
|
|
68
|
+
if (!job.firstFrame)
|
|
69
|
+
throw remoteError('REMOTE_UNSUPPORTED', 'Image to video needs a first frame.');
|
|
70
|
+
if (job.lastFrame && !job.model.params.last_frame)
|
|
71
|
+
throw remoteError('REMOTE_UNSUPPORTED', `${job.model.name} does not take a last frame.`);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The `POST /video_generation` body. `resolution` and `duration` are required, so the model's
|
|
75
|
+
* defaults fill in what the job left out; text to video takes the job's ratio or the model's default
|
|
76
|
+
* (`16:9` without one), image to video none.
|
|
77
|
+
*/
|
|
78
|
+
export function minimaxV2Body(job) {
|
|
79
|
+
checkInputs(job);
|
|
80
|
+
const params = job.model.params;
|
|
81
|
+
const content = [{ type: 'text', text: job.prompt }];
|
|
82
|
+
if (job.workflow === 'image-to-video' && job.firstFrame) {
|
|
83
|
+
content.push({
|
|
84
|
+
type: 'image_url',
|
|
85
|
+
image_url: { url: toDataUrl(job.firstFrame.bytes, job.firstFrame.mime) },
|
|
86
|
+
role: 'first_frame',
|
|
87
|
+
});
|
|
88
|
+
if (job.lastFrame)
|
|
89
|
+
content.push({
|
|
90
|
+
type: 'image_url',
|
|
91
|
+
image_url: { url: toDataUrl(job.lastFrame.bytes, job.lastFrame.mime) },
|
|
92
|
+
role: 'last_frame',
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
const body = {
|
|
96
|
+
model: job.model.id,
|
|
97
|
+
content,
|
|
98
|
+
resolution: job.resolution ?? params.resolutions?.default ?? params.resolutions?.values[0] ?? '768P',
|
|
99
|
+
duration: Math.round(job.durationSecs ?? params.durations?.default ?? params.durations?.min ?? 6),
|
|
100
|
+
};
|
|
101
|
+
if (job.workflow === 'create')
|
|
102
|
+
body['ratio'] = job.aspectRatio ?? params.aspect_ratios?.default ?? '16:9';
|
|
103
|
+
return body;
|
|
104
|
+
}
|
|
105
|
+
async function pollTask(ctx, id) {
|
|
106
|
+
const body = await callV2(ctx, `${minimaxV2Base(ctx.baseUrl)}/query/video_generation/${encodeURIComponent(id)}`);
|
|
107
|
+
const task = 'task' in body ? fields(body['task']) : body;
|
|
108
|
+
const status = typeof task['status'] === 'string' ? task['status'].toLowerCase() : '';
|
|
109
|
+
switch (status) {
|
|
110
|
+
case 'queued':
|
|
111
|
+
return { state: 'queued' };
|
|
112
|
+
case 'succeeded': {
|
|
113
|
+
const url = textOf(fields(task['content'])['url']);
|
|
114
|
+
if (!url)
|
|
115
|
+
return {
|
|
116
|
+
state: 'failed',
|
|
117
|
+
error: remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} finished without a clip.`),
|
|
118
|
+
};
|
|
119
|
+
return { state: 'completed', result: { url } };
|
|
120
|
+
}
|
|
121
|
+
case 'failed':
|
|
122
|
+
return { state: 'failed', error: minimaxTaskError(ctx.provider, task['error']) };
|
|
123
|
+
case 'cancelled':
|
|
124
|
+
return { state: 'failed', error: remoteError('CANCELLED', `${ctx.provider} cancelled the generation.`) };
|
|
125
|
+
default:
|
|
126
|
+
return { state: 'running' };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** A clip the provider pointed at, refused unless its bytes are a video. */
|
|
130
|
+
async function fetchClip(ctx, url) {
|
|
131
|
+
const file = await downloadResult(ctx, url, { maxBytes: MAX_VIDEO_BYTES, what: 'video' });
|
|
132
|
+
const mime = sniffVideoMime(file.bytes);
|
|
133
|
+
if (!mime)
|
|
134
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} returned a file that is not a video.`, file.mime || undefined);
|
|
135
|
+
return { bytes: file.bytes, mime };
|
|
136
|
+
}
|
|
137
|
+
/** The clip's link as the task gives it now. */
|
|
138
|
+
async function refreshedUrl(ctx, id) {
|
|
139
|
+
const poll = await pollTask(ctx, id);
|
|
140
|
+
if (poll.state === 'completed' && poll.result.url)
|
|
141
|
+
return poll.result.url;
|
|
142
|
+
if (poll.state === 'failed')
|
|
143
|
+
throw poll.error;
|
|
144
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} has no clip for this task.`, poll.state);
|
|
145
|
+
}
|
|
146
|
+
/** A link refused like this has most likely expired; the task hands out a fresh one. */
|
|
147
|
+
const EXPIRED = ['REMOTE_AUTH_FAILED', 'REMOTE_REJECTED'];
|
|
148
|
+
export const MINIMAX_VIDEO_V2 = {
|
|
149
|
+
dialect: 'minimax-video-v2',
|
|
150
|
+
kind: 'video',
|
|
151
|
+
pollIntervalMs: { first: 5000, max: 15000 },
|
|
152
|
+
async submit(ctx, job) {
|
|
153
|
+
const body = await callV2(ctx, `${minimaxV2Base(ctx.baseUrl)}/video_generation`, {
|
|
154
|
+
json: minimaxV2Body(job),
|
|
155
|
+
});
|
|
156
|
+
const id = textOf(body['task_id']) ?? (typeof body['task_id'] === 'number' ? String(body['task_id']) : undefined);
|
|
157
|
+
if (!id)
|
|
158
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} answered without a task id.`);
|
|
159
|
+
return { id };
|
|
160
|
+
},
|
|
161
|
+
poll(ctx, submission) {
|
|
162
|
+
return pollTask(ctx, submission.id);
|
|
163
|
+
},
|
|
164
|
+
async download(ctx, submission, result) {
|
|
165
|
+
const first = result.url ?? (await refreshedUrl(ctx, submission.id));
|
|
166
|
+
try {
|
|
167
|
+
return await fetchClip(ctx, first);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
const code = error?.code;
|
|
171
|
+
if (!result.url || typeof code !== 'string' || !EXPIRED.includes(code))
|
|
172
|
+
throw error;
|
|
173
|
+
const fresh = await refreshedUrl(ctx, submission.id);
|
|
174
|
+
if (fresh === first)
|
|
175
|
+
throw error;
|
|
176
|
+
return fetchClip(ctx, fresh);
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
async cancel(ctx, submission) {
|
|
180
|
+
try {
|
|
181
|
+
await callProvider(ctx, `${minimaxV2Base(ctx.baseUrl)}/video_generation/${encodeURIComponent(submission.id)}`, {
|
|
182
|
+
method: 'DELETE',
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
// Only a queued task can be cancelled; a running one just finishes.
|
|
187
|
+
ctx.log('debug', `${ctx.provider}: cancel of ${submission.id} refused: ${error.message}`);
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=minimax-video-v2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimax-video-v2.js","sourceRoot":"","sources":["../../../src/media/adapters/minimax-video-v2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `minimax-video`: MiniMax's V1 video API (Hailuo 2.3, Hailuo 2.3 Fast, Hailuo 02) on the registered
|
|
3
|
+
* base, `https://api.minimax.io/v1` (`https://api.minimaxi.com/v1` in mainland China).
|
|
4
|
+
*
|
|
5
|
+
* - submit → `POST {base}/video_generation` `{model, prompt, prompt_optimizer, duration, resolution,
|
|
6
|
+
* first_frame_image, last_frame_image}` (frames as data URLs) → `{task_id}`;
|
|
7
|
+
* - poll → `GET {base}/query/video_generation?task_id=` → `status` Preparing | Queueing | Processing |
|
|
8
|
+
* Success | Fail, and `file_id` once it succeeded;
|
|
9
|
+
* - download → `GET {base}/files/retrieve?file_id=` → `file.download_url` (a CDN link valid for an
|
|
10
|
+
* hour, fetched without the key) → the clip.
|
|
11
|
+
*
|
|
12
|
+
* No cancel and no listing: the catalog names the models. V1 answers most failures as HTTP 200 with
|
|
13
|
+
* `base_resp.status_code` other than 0; `minimaxStatusError` maps those codes.
|
|
14
|
+
*/
|
|
15
|
+
import type { AtomicCoreError } from '../../contracts/index.js';
|
|
16
|
+
import type { VideoAdapter, VideoGenerationJob } from './types.js';
|
|
17
|
+
type Fields = Record<string, unknown>;
|
|
18
|
+
/** A MiniMax status code (`base_resp.status_code`, a failed task's `error.code`) as a `REMOTE_*` error. */
|
|
19
|
+
export declare function minimaxCodeError(provider: string, code: number, said: string | undefined): AtomicCoreError;
|
|
20
|
+
/**
|
|
21
|
+
* The failure a V1 answer carries in `base_resp` (MiniMax answers errors as HTTP 200), or `undefined`
|
|
22
|
+
* when `status_code` is 0 or absent.
|
|
23
|
+
*/
|
|
24
|
+
export declare function minimaxStatusError(provider: string, body: unknown): AtomicCoreError | undefined;
|
|
25
|
+
/** The `POST /video_generation` body: what the job set and the model offers. */
|
|
26
|
+
export declare function minimaxV1Body(job: VideoGenerationJob): Fields;
|
|
27
|
+
export declare const MINIMAX_VIDEO: VideoAdapter;
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `minimax-video`: MiniMax's V1 video API (Hailuo 2.3, Hailuo 2.3 Fast, Hailuo 02) on the registered
|
|
3
|
+
* base, `https://api.minimax.io/v1` (`https://api.minimaxi.com/v1` in mainland China).
|
|
4
|
+
*
|
|
5
|
+
* - submit → `POST {base}/video_generation` `{model, prompt, prompt_optimizer, duration, resolution,
|
|
6
|
+
* first_frame_image, last_frame_image}` (frames as data URLs) → `{task_id}`;
|
|
7
|
+
* - poll → `GET {base}/query/video_generation?task_id=` → `status` Preparing | Queueing | Processing |
|
|
8
|
+
* Success | Fail, and `file_id` once it succeeded;
|
|
9
|
+
* - download → `GET {base}/files/retrieve?file_id=` → `file.download_url` (a CDN link valid for an
|
|
10
|
+
* hour, fetched without the key) → the clip.
|
|
11
|
+
*
|
|
12
|
+
* No cancel and no listing: the catalog names the models. V1 answers most failures as HTTP 200 with
|
|
13
|
+
* `base_resp.status_code` other than 0; `minimaxStatusError` maps those codes.
|
|
14
|
+
*/
|
|
15
|
+
import { callProvider, downloadResult, joinUrl, MAX_VIDEO_BYTES, providerMessage, remoteError, sniffVideoMime, toDataUrl, } from '../http.js';
|
|
16
|
+
const fields = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
17
|
+
/** A string, or a number the provider sent where a string id was meant. */
|
|
18
|
+
const idOf = (value) => typeof value === 'string' && value.trim() !== ''
|
|
19
|
+
? value.trim()
|
|
20
|
+
: typeof value === 'number' && Number.isFinite(value)
|
|
21
|
+
? String(value)
|
|
22
|
+
: undefined;
|
|
23
|
+
/** A MiniMax status code (`base_resp.status_code`, a failed task's `error.code`) as a `REMOTE_*` error. */
|
|
24
|
+
export function minimaxCodeError(provider, code, said) {
|
|
25
|
+
const details = `status_code ${code}${said ? `: ${said}` : ''}`;
|
|
26
|
+
switch (code) {
|
|
27
|
+
case 1002:
|
|
28
|
+
case 1039:
|
|
29
|
+
return remoteError('REMOTE_RATE_LIMITED', `${provider} is rate-limiting requests.`, details);
|
|
30
|
+
case 1004:
|
|
31
|
+
case 2049:
|
|
32
|
+
return remoteError('REMOTE_AUTH_FAILED', `${provider} refused the API key or the model.`, details);
|
|
33
|
+
case 1008:
|
|
34
|
+
return remoteError('REMOTE_QUOTA', `${provider} says the account is out of credit.`, details);
|
|
35
|
+
case 1026:
|
|
36
|
+
case 1027:
|
|
37
|
+
return remoteError('REMOTE_CONTENT_BLOCKED', said ? `${provider} refused the content: ${said}` : `${provider} refused the content.`, details);
|
|
38
|
+
case 2013:
|
|
39
|
+
return remoteError('REMOTE_REJECTED', said ? `${provider}: ${said}` : `${provider} refused the request.`, details);
|
|
40
|
+
default:
|
|
41
|
+
return remoteError('REMOTE_UNAVAILABLE', said ? `${provider} failed: ${said}` : `${provider} failed.`, details);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The failure a V1 answer carries in `base_resp` (MiniMax answers errors as HTTP 200), or `undefined`
|
|
46
|
+
* when `status_code` is 0 or absent.
|
|
47
|
+
*/
|
|
48
|
+
export function minimaxStatusError(provider, body) {
|
|
49
|
+
const base = fields(fields(body)['base_resp']);
|
|
50
|
+
const raw = base['status_code'];
|
|
51
|
+
const code = typeof raw === 'number' ? raw : typeof raw === 'string' ? Number(raw) : 0;
|
|
52
|
+
if (!Number.isFinite(code) || code === 0)
|
|
53
|
+
return undefined;
|
|
54
|
+
return minimaxCodeError(provider, code, providerMessage(base));
|
|
55
|
+
}
|
|
56
|
+
/** One V1 request: HTTP errors as `REMOTE_*`, then a non-zero `base_resp` as one too. */
|
|
57
|
+
async function callV1(ctx, url, options = {}) {
|
|
58
|
+
const answer = await callProvider(ctx, url, options);
|
|
59
|
+
const failure = minimaxStatusError(ctx.provider, answer.json);
|
|
60
|
+
if (failure)
|
|
61
|
+
throw failure;
|
|
62
|
+
return fields(answer.json);
|
|
63
|
+
}
|
|
64
|
+
/** The workflow is the model's, and image to video has the frames it needs. */
|
|
65
|
+
function checkInputs(job) {
|
|
66
|
+
if (!job.model.workflows.includes(job.workflow))
|
|
67
|
+
throw remoteError('REMOTE_UNSUPPORTED', `${job.model.name} cannot do ${job.workflow}.`, job.workflow);
|
|
68
|
+
if (job.workflow !== 'image-to-video')
|
|
69
|
+
return;
|
|
70
|
+
if (!job.firstFrame)
|
|
71
|
+
throw remoteError('REMOTE_UNSUPPORTED', 'Image to video needs a first frame.');
|
|
72
|
+
if (job.lastFrame && !job.model.params.last_frame)
|
|
73
|
+
throw remoteError('REMOTE_UNSUPPORTED', `${job.model.name} does not take a last frame.`);
|
|
74
|
+
}
|
|
75
|
+
/** The `POST /video_generation` body: what the job set and the model offers. */
|
|
76
|
+
export function minimaxV1Body(job) {
|
|
77
|
+
checkInputs(job);
|
|
78
|
+
const params = job.model.params;
|
|
79
|
+
const body = { model: job.model.id };
|
|
80
|
+
if (job.prompt.trim() !== '')
|
|
81
|
+
body['prompt'] = job.prompt;
|
|
82
|
+
body['prompt_optimizer'] = true;
|
|
83
|
+
if (job.durationSecs !== undefined && params.durations)
|
|
84
|
+
body['duration'] = Math.round(job.durationSecs);
|
|
85
|
+
if (job.resolution && params.resolutions)
|
|
86
|
+
body['resolution'] = job.resolution;
|
|
87
|
+
if (job.workflow === 'image-to-video' && job.firstFrame) {
|
|
88
|
+
body['first_frame_image'] = toDataUrl(job.firstFrame.bytes, job.firstFrame.mime);
|
|
89
|
+
if (job.lastFrame)
|
|
90
|
+
body['last_frame_image'] = toDataUrl(job.lastFrame.bytes, job.lastFrame.mime);
|
|
91
|
+
}
|
|
92
|
+
return body;
|
|
93
|
+
}
|
|
94
|
+
/** A clip the provider pointed at, refused unless its bytes are a video. */
|
|
95
|
+
async function fetchClip(ctx, url) {
|
|
96
|
+
const file = await downloadResult(ctx, url, { maxBytes: MAX_VIDEO_BYTES, what: 'video' });
|
|
97
|
+
const mime = sniffVideoMime(file.bytes);
|
|
98
|
+
if (!mime)
|
|
99
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} returned a file that is not a video.`, file.mime || undefined);
|
|
100
|
+
return { bytes: file.bytes, mime };
|
|
101
|
+
}
|
|
102
|
+
export const MINIMAX_VIDEO = {
|
|
103
|
+
dialect: 'minimax-video',
|
|
104
|
+
kind: 'video',
|
|
105
|
+
pollIntervalMs: { first: 5000, max: 15000 },
|
|
106
|
+
async submit(ctx, job) {
|
|
107
|
+
const body = await callV1(ctx, joinUrl(ctx.baseUrl, '/video_generation'), { json: minimaxV1Body(job) });
|
|
108
|
+
const id = idOf(body['task_id']);
|
|
109
|
+
if (!id)
|
|
110
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} answered without a task id.`);
|
|
111
|
+
return { id };
|
|
112
|
+
},
|
|
113
|
+
async poll(ctx, submission) {
|
|
114
|
+
const answer = await callProvider(ctx, joinUrl(ctx.baseUrl, `/query/video_generation?task_id=${encodeURIComponent(submission.id)}`));
|
|
115
|
+
const body = fields(answer.json);
|
|
116
|
+
const failure = minimaxStatusError(ctx.provider, body);
|
|
117
|
+
const status = typeof body['status'] === 'string' ? body['status'].toLowerCase() : '';
|
|
118
|
+
if (status === 'fail' || status === 'failed')
|
|
119
|
+
return {
|
|
120
|
+
state: 'failed',
|
|
121
|
+
error: failure ?? remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} could not make the clip.`),
|
|
122
|
+
};
|
|
123
|
+
// A refused prompt or result ends the job; any other code is the query's own failure.
|
|
124
|
+
if (failure?.code === 'REMOTE_CONTENT_BLOCKED')
|
|
125
|
+
return { state: 'failed', error: failure };
|
|
126
|
+
if (failure)
|
|
127
|
+
throw failure;
|
|
128
|
+
if (status === 'success') {
|
|
129
|
+
const fileId = idOf(body['file_id']);
|
|
130
|
+
if (!fileId)
|
|
131
|
+
return {
|
|
132
|
+
state: 'failed',
|
|
133
|
+
error: remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} finished without a file.`),
|
|
134
|
+
};
|
|
135
|
+
return { state: 'completed', result: { data: { file_id: fileId } } };
|
|
136
|
+
}
|
|
137
|
+
if (status === 'preparing' || status === 'queueing' || status === 'queued')
|
|
138
|
+
return { state: 'queued' };
|
|
139
|
+
return { state: 'running' };
|
|
140
|
+
},
|
|
141
|
+
async download(ctx, _submission, result) {
|
|
142
|
+
const fileId = idOf(result.data?.['file_id']);
|
|
143
|
+
if (!fileId) {
|
|
144
|
+
if (result.url)
|
|
145
|
+
return fetchClip(ctx, result.url);
|
|
146
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} gave no file to download.`);
|
|
147
|
+
}
|
|
148
|
+
const body = await callV1(ctx, joinUrl(ctx.baseUrl, `/files/retrieve?file_id=${encodeURIComponent(fileId)}`));
|
|
149
|
+
const url = fields(body['file'])['download_url'];
|
|
150
|
+
if (typeof url !== 'string' || url === '')
|
|
151
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} answered without a download link.`, fileId);
|
|
152
|
+
return fetchClip(ctx, url);
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
//# sourceMappingURL=minimax-video.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimax-video.js","sourceRoot":"","sources":["../../../src/media/adapters/minimax-video.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mistral-agent-image`: Mistral has no image endpoint; its Agents expose an `image_generation` tool
|
|
3
|
+
* (FLUX1.1 Ultra behind it). One image is one conversation:
|
|
4
|
+
*
|
|
5
|
+
* - `POST {base}/conversations` with `{model: model.id, inputs: <instruction + prompt>, tools:
|
|
6
|
+
* [{type: 'image_generation'}], store: false}` (base `https://api.mistral.ai/v1`);
|
|
7
|
+
* - the answer's outputs carry `tool_file` chunks (`{file_id, file_name, file_type}`), found by
|
|
8
|
+
* walking the JSON so a reshuffled envelope still reads;
|
|
9
|
+
* - `GET {base}/files/{file_id}/content` downloads the image (the provider's own origin, so with the key).
|
|
10
|
+
*
|
|
11
|
+
* No `tool_file` means the model answered in words instead (a refusal, a question): that is
|
|
12
|
+
* `REMOTE_REJECTED` carrying what it said. `n` images are `n` conversations.
|
|
13
|
+
*/
|
|
14
|
+
import type { ImageAdapter, ImageGenerationJob } from './types.js';
|
|
15
|
+
/** What the agent is told before the user's prompt. */
|
|
16
|
+
export declare const MISTRAL_IMAGE_INSTRUCTION: string;
|
|
17
|
+
/** A file the image_generation tool made. */
|
|
18
|
+
export interface MistralToolFile {
|
|
19
|
+
fileId: string;
|
|
20
|
+
fileName?: string;
|
|
21
|
+
fileType?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The `tool_file` chunks of a conversation answer, in order, and the text the model said, wherever
|
|
25
|
+
* they sit (`outputs[].content[]` today).
|
|
26
|
+
*/
|
|
27
|
+
export declare function mistralToolFiles(json: unknown): {
|
|
28
|
+
files: MistralToolFile[];
|
|
29
|
+
text: string;
|
|
30
|
+
};
|
|
31
|
+
/** The conversation that makes one image. */
|
|
32
|
+
export declare function mistralConversation(job: ImageGenerationJob): Record<string, unknown>;
|
|
33
|
+
export declare const MISTRAL_AGENT_IMAGE: ImageAdapter;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mistral-agent-image`: Mistral has no image endpoint; its Agents expose an `image_generation` tool
|
|
3
|
+
* (FLUX1.1 Ultra behind it). One image is one conversation:
|
|
4
|
+
*
|
|
5
|
+
* - `POST {base}/conversations` with `{model: model.id, inputs: <instruction + prompt>, tools:
|
|
6
|
+
* [{type: 'image_generation'}], store: false}` (base `https://api.mistral.ai/v1`);
|
|
7
|
+
* - the answer's outputs carry `tool_file` chunks (`{file_id, file_name, file_type}`), found by
|
|
8
|
+
* walking the JSON so a reshuffled envelope still reads;
|
|
9
|
+
* - `GET {base}/files/{file_id}/content` downloads the image (the provider's own origin, so with the key).
|
|
10
|
+
*
|
|
11
|
+
* No `tool_file` means the model answered in words instead (a refusal, a question): that is
|
|
12
|
+
* `REMOTE_REJECTED` carrying what it said. `n` images are `n` conversations.
|
|
13
|
+
*/
|
|
14
|
+
import { callProvider, downloadResult, GENERATE_TIMEOUT_MS, joinUrl, MAX_IMAGE_BYTES, remoteError, sniffImageMime, } from '../http.js';
|
|
15
|
+
/** What the agent is told before the user's prompt. */
|
|
16
|
+
export const MISTRAL_IMAGE_INSTRUCTION = 'Generate exactly one image with the image_generation tool. Do not ask questions and do not describe the ' +
|
|
17
|
+
'image; call the tool once with this description:';
|
|
18
|
+
/** How deep the answer is walked; its chunks sit three or four levels down. */
|
|
19
|
+
const MAX_DEPTH = 8;
|
|
20
|
+
/**
|
|
21
|
+
* The `tool_file` chunks of a conversation answer, in order, and the text the model said, wherever
|
|
22
|
+
* they sit (`outputs[].content[]` today).
|
|
23
|
+
*/
|
|
24
|
+
export function mistralToolFiles(json) {
|
|
25
|
+
const files = [];
|
|
26
|
+
const said = [];
|
|
27
|
+
const seen = new Set();
|
|
28
|
+
const visit = (value, depth) => {
|
|
29
|
+
if (depth > MAX_DEPTH || value === null || typeof value !== 'object')
|
|
30
|
+
return;
|
|
31
|
+
if (Array.isArray(value)) {
|
|
32
|
+
for (const item of value)
|
|
33
|
+
visit(item, depth + 1);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const fields = value;
|
|
37
|
+
const type = fields['type'];
|
|
38
|
+
const fileId = fields['file_id'];
|
|
39
|
+
if (type === 'tool_file' && typeof fileId === 'string' && fileId !== '') {
|
|
40
|
+
if (!seen.has(fileId)) {
|
|
41
|
+
seen.add(fileId);
|
|
42
|
+
const file = { fileId };
|
|
43
|
+
if (typeof fields['file_name'] === 'string')
|
|
44
|
+
file.fileName = fields['file_name'];
|
|
45
|
+
if (typeof fields['file_type'] === 'string')
|
|
46
|
+
file.fileType = fields['file_type'];
|
|
47
|
+
files.push(file);
|
|
48
|
+
}
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (type === 'text' && typeof fields['text'] === 'string')
|
|
52
|
+
said.push(fields['text']);
|
|
53
|
+
else if (type === 'message.output' && typeof fields['content'] === 'string')
|
|
54
|
+
said.push(fields['content']);
|
|
55
|
+
for (const [key, item] of Object.entries(fields))
|
|
56
|
+
if (key !== 'usage')
|
|
57
|
+
visit(item, depth + 1);
|
|
58
|
+
};
|
|
59
|
+
visit(json, 0);
|
|
60
|
+
return { files, text: said.join(' ').replace(/\s+/g, ' ').trim() };
|
|
61
|
+
}
|
|
62
|
+
/** The conversation that makes one image. */
|
|
63
|
+
export function mistralConversation(job) {
|
|
64
|
+
return {
|
|
65
|
+
model: job.model.id,
|
|
66
|
+
inputs: `${MISTRAL_IMAGE_INSTRUCTION}\n\n${job.prompt}`,
|
|
67
|
+
tools: [{ type: 'image_generation' }],
|
|
68
|
+
store: false,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
async function oneImage(ctx, job) {
|
|
72
|
+
const answer = await callProvider(ctx, joinUrl(ctx.baseUrl, '/conversations'), {
|
|
73
|
+
json: mistralConversation(job),
|
|
74
|
+
timeoutMs: GENERATE_TIMEOUT_MS,
|
|
75
|
+
});
|
|
76
|
+
const { files, text } = mistralToolFiles(answer.json);
|
|
77
|
+
if (files.length === 0)
|
|
78
|
+
throw remoteError('REMOTE_REJECTED', text ? `${ctx.provider}: ${text.slice(0, 300)}` : `${ctx.provider} answered without an image.`, text.slice(0, 1000) || undefined);
|
|
79
|
+
const out = [];
|
|
80
|
+
// The tool makes one image per call; a second file is taken too rather than dropped.
|
|
81
|
+
for (const file of files) {
|
|
82
|
+
const url = joinUrl(ctx.baseUrl, `/files/${encodeURIComponent(file.fileId)}/content`);
|
|
83
|
+
const { bytes } = await downloadResult(ctx, url, { maxBytes: MAX_IMAGE_BYTES, what: 'image' });
|
|
84
|
+
const mime = sniffImageMime(bytes);
|
|
85
|
+
if (!mime)
|
|
86
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} returned a file that is not an image.`, file.fileId);
|
|
87
|
+
out.push({ bytes, mime });
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
export const MISTRAL_AGENT_IMAGE = {
|
|
92
|
+
dialect: 'mistral-agent-image',
|
|
93
|
+
kind: 'image',
|
|
94
|
+
async generate(ctx, job, report) {
|
|
95
|
+
report({ phase: 'generating' });
|
|
96
|
+
if (job.workflow !== 'create')
|
|
97
|
+
throw remoteError('REMOTE_UNSUPPORTED', 'This model only creates images from a prompt here.', job.workflow);
|
|
98
|
+
const count = Math.max(1, job.n);
|
|
99
|
+
const out = [];
|
|
100
|
+
while (out.length < count) {
|
|
101
|
+
out.push(...(await oneImage(ctx, job)));
|
|
102
|
+
if (count > 1)
|
|
103
|
+
report({ phase: 'generating', fraction: Math.min(out.length / count, 1) });
|
|
104
|
+
}
|
|
105
|
+
return out.slice(0, count);
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=mistral-agent-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mistral-agent-image.js","sourceRoot":"","sources":["../../../src/media/adapters/mistral-agent-image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `nvidia-genai`: NVIDIA's Visual GenAI image models — the hosted API catalog and self-hosted NIMs.
|
|
3
|
+
*
|
|
4
|
+
* Where a request goes:
|
|
5
|
+
* - the API catalog (registered base `https://integrate.api.nvidia.com/v1`) serves visual models on a
|
|
6
|
+
* different host: `POST https://ai.api.nvidia.com/v1/genai/{model.id}`. This host mapping is
|
|
7
|
+
* hardcoded here — the one sanctioned exception to "every URL from the base" — and applies only
|
|
8
|
+
* when the base's host is `integrate.api.nvidia.com`;
|
|
9
|
+
* - any other base is a self-hosted NIM: `POST {base without its /v1}/v1/infer`.
|
|
10
|
+
*
|
|
11
|
+
* The body follows the model's `options.schema` (each NVIDIA endpoint rejects fields it does not
|
|
12
|
+
* know): `flux-schnell`, `flux-dev`, `flux2-klein`, `sd3`; a model without one gets the prompt and
|
|
13
|
+
* only what the job set. The answer is `{artifacts: [{base64, finishReason, seed}]}` (SD3:
|
|
14
|
+
* `{image, finish_reason, seed}`), one JPEG per call, so `n` images are `n` calls. A
|
|
15
|
+
* `CONTENT_FILTERED` finish is `REMOTE_CONTENT_BLOCKED`. When the hosted API answers 202 (NVCF: the
|
|
16
|
+
* job outlived its synchronous window) the request id is polled on
|
|
17
|
+
* `https://ai.api.nvidia.com/v1/status/{id}` — NVIDIA documents several spellings of that path and
|
|
18
|
+
* none for these models, so this one is unverified; a wrong one ends as the provider's 404.
|
|
19
|
+
*/
|
|
20
|
+
import type { MediaContext } from '../http.js';
|
|
21
|
+
import type { GeneratedImage, ImageAdapter, ImageGenerationJob } from './types.js';
|
|
22
|
+
/** Where a model's generation goes (see the file comment). */
|
|
23
|
+
export declare function nvidiaInferUrl(baseUrl: string, modelId: string): string;
|
|
24
|
+
/** The request body for image `index` of a job, by the model's `options.schema`. */
|
|
25
|
+
export declare function nvidiaBody(job: ImageGenerationJob, index?: number): Record<string, unknown>;
|
|
26
|
+
/** The images of an answer; a filtered or failed finish throws. */
|
|
27
|
+
export declare function nvidiaImages(ctx: Pick<MediaContext, 'provider'>, json: unknown): GeneratedImage[];
|
|
28
|
+
export declare const NVIDIA_GENAI: ImageAdapter;
|