@atomic-chat/core 0.13.6 → 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 +5 -5
- package/dist/core/atomic-core.js.map +1 -1
- package/dist/core/create.js +43 -59
- package/dist/core/create.js.map +1 -1
- package/dist/core/managed-engines.js +2 -0
- package/dist/core/managed-engines.js.map +1 -1
- package/dist/core/prism.d.ts +21 -6
- package/dist/core/prism.js +44 -0
- package/dist/core/prism.js.map +1 -1
- package/dist/core/types.d.ts +0 -5
- package/dist/core/types.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 +6 -1
- package/dist/diffusion/jobs.js.map +1 -1
- package/dist/diffusion/media-header.d.ts +22 -0
- package/dist/diffusion/media-header.js +149 -0
- package/dist/diffusion/media-header.js.map +1 -0
- package/dist/diffusion/parse.d.ts +3 -1
- package/dist/diffusion/parse.js +36 -0
- package/dist/diffusion/parse.js.map +1 -1
- package/dist/diffusion/recipe.d.ts +10 -1
- package/dist/diffusion/recipe.js +85 -21
- package/dist/diffusion/recipe.js.map +1 -1
- package/dist/diffusion/remote-job.d.ts +76 -0
- package/dist/diffusion/remote-job.js +643 -0
- package/dist/diffusion/remote-job.js.map +1 -0
- package/dist/diffusion/remote-store.d.ts +38 -0
- package/dist/diffusion/remote-store.js +91 -0
- package/dist/diffusion/remote-store.js.map +1 -0
- package/dist/diffusion/service.d.ts +9 -1
- package/dist/diffusion/service.js +49 -9
- package/dist/diffusion/service.js.map +1 -1
- package/dist/diffusion/state.d.ts +13 -1
- package/dist/diffusion/state.js +8 -0
- package/dist/diffusion/state.js.map +1 -1
- package/dist/diffusion/video-gallery.d.ts +11 -4
- package/dist/diffusion/video-gallery.js +62 -25
- package/dist/diffusion/video-gallery.js.map +1 -1
- package/dist/diffusion/video-history.js +4 -1
- package/dist/diffusion/video-history.js.map +1 -1
- package/dist/diffusion/video-recipe.js +58 -25
- package/dist/diffusion/video-recipe.js.map +1 -1
- package/dist/diffusion/wiring.d.ts +3 -0
- package/dist/diffusion/wiring.js +1 -0
- package/dist/diffusion/wiring.js.map +1 -1
- package/dist/downloads/downloader.d.ts +1 -18
- package/dist/downloads/downloader.js +1 -45
- package/dist/downloads/downloader.js.map +1 -1
- package/dist/media/adapters/a1111.d.ts +32 -0
- package/dist/media/adapters/a1111.js +207 -0
- package/dist/media/adapters/a1111.js.map +1 -0
- package/dist/media/adapters/aimlapi-videos.d.ts +34 -0
- package/dist/media/adapters/aimlapi-videos.js +172 -0
- package/dist/media/adapters/aimlapi-videos.js.map +1 -0
- package/dist/media/adapters/dashscope-image.d.ts +26 -0
- package/dist/media/adapters/dashscope-image.js +160 -0
- package/dist/media/adapters/dashscope-image.js.map +1 -0
- package/dist/media/adapters/dashscope-video.d.ts +47 -0
- package/dist/media/adapters/dashscope-video.js +251 -0
- package/dist/media/adapters/dashscope-video.js.map +1 -0
- package/dist/media/adapters/gemini-image.d.ts +27 -0
- package/dist/media/adapters/gemini-image.js +181 -0
- package/dist/media/adapters/gemini-image.js.map +1 -0
- package/dist/media/adapters/gemini-veo.d.ts +39 -0
- package/dist/media/adapters/gemini-veo.js +196 -0
- package/dist/media/adapters/gemini-veo.js.map +1 -0
- package/dist/media/adapters/hf-images.d.ts +85 -0
- package/dist/media/adapters/hf-images.js +439 -0
- package/dist/media/adapters/hf-images.js.map +1 -0
- package/dist/media/adapters/hf-videos.d.ts +44 -0
- package/dist/media/adapters/hf-videos.js +265 -0
- package/dist/media/adapters/hf-videos.js.map +1 -0
- package/dist/media/adapters/minimax-image.d.ts +26 -0
- package/dist/media/adapters/minimax-image.js +111 -0
- package/dist/media/adapters/minimax-image.js.map +1 -0
- package/dist/media/adapters/minimax-video-v2.d.ts +34 -0
- package/dist/media/adapters/minimax-video-v2.js +191 -0
- package/dist/media/adapters/minimax-video-v2.js.map +1 -0
- package/dist/media/adapters/minimax-video.d.ts +28 -0
- package/dist/media/adapters/minimax-video.js +155 -0
- package/dist/media/adapters/minimax-video.js.map +1 -0
- package/dist/media/adapters/mistral-agent-image.d.ts +33 -0
- package/dist/media/adapters/mistral-agent-image.js +108 -0
- package/dist/media/adapters/mistral-agent-image.js.map +1 -0
- package/dist/media/adapters/nvidia-genai.d.ts +28 -0
- package/dist/media/adapters/nvidia-genai.js +182 -0
- package/dist/media/adapters/nvidia-genai.js.map +1 -0
- package/dist/media/adapters/openai-images.d.ts +23 -0
- package/dist/media/adapters/openai-images.js +164 -0
- package/dist/media/adapters/openai-images.js.map +1 -0
- package/dist/media/adapters/openai-videos.d.ts +34 -0
- package/dist/media/adapters/openai-videos.js +175 -0
- package/dist/media/adapters/openai-videos.js.map +1 -0
- package/dist/media/adapters/openrouter-images.d.ts +25 -0
- package/dist/media/adapters/openrouter-images.js +161 -0
- package/dist/media/adapters/openrouter-images.js.map +1 -0
- package/dist/media/adapters/openrouter-videos.d.ts +43 -0
- package/dist/media/adapters/openrouter-videos.js +208 -0
- package/dist/media/adapters/openrouter-videos.js.map +1 -0
- package/dist/media/adapters/registry.d.ts +7 -0
- package/dist/media/adapters/registry.js +45 -0
- package/dist/media/adapters/registry.js.map +1 -0
- package/dist/media/adapters/types.d.ts +133 -0
- package/dist/media/adapters/types.js +15 -0
- package/dist/media/adapters/types.js.map +1 -0
- package/dist/media/adapters/xai-images.d.ts +19 -0
- package/dist/media/adapters/xai-images.js +83 -0
- package/dist/media/adapters/xai-images.js.map +1 -0
- package/dist/media/adapters/xai-videos.d.ts +29 -0
- package/dist/media/adapters/xai-videos.js +148 -0
- package/dist/media/adapters/xai-videos.js.map +1 -0
- package/dist/media/catalog-baseline.d.ts +2 -0
- package/dist/media/catalog-baseline.js +10 -0
- package/dist/media/catalog-baseline.js.map +1 -0
- package/dist/media/catalog-baseline.json +1819 -0
- package/dist/media/catalog-service.d.ts +42 -0
- package/dist/media/catalog-service.js +111 -0
- package/dist/media/catalog-service.js.map +1 -0
- package/dist/media/catalog.d.ts +50 -0
- package/dist/media/catalog.js +315 -0
- package/dist/media/catalog.js.map +1 -0
- package/dist/media/http.d.ts +125 -0
- package/dist/media/http.js +308 -0
- package/dist/media/http.js.map +1 -0
- package/dist/media/index.d.ts +14 -0
- package/dist/media/index.js +15 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/mask.d.ts +12 -0
- package/dist/media/mask.js +57 -0
- package/dist/media/mask.js.map +1 -0
- package/dist/media/service.d.ts +42 -0
- package/dist/media/service.js +144 -0
- package/dist/media/service.js.map +1 -0
- package/dist/models/hf.d.ts +3 -16
- package/dist/models/hf.js +4 -42
- package/dist/models/hf.js.map +1 -1
- package/dist/router/resolve.d.ts +15 -4
- package/dist/router/resolve.js +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/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/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 +4 -3
- 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 +14 -20
- package/dist/server/control/types.js.map +1 -1
- package/dist/server/http.js +15 -2
- package/dist/server/http.js.map +1 -1
- package/dist/server/public/images-params.js +18 -1
- package/dist/server/public/images-params.js.map +1 -1
- package/dist/server/public/images.d.ts +11 -2
- package/dist/server/public/images.js +73 -9
- package/dist/server/public/images.js.map +1 -1
- package/dist/server/public/index.js +7 -1
- package/dist/server/public/index.js.map +1 -1
- package/dist/server/public/listing.js +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 +5 -1
- package/dist/server/public/videos-params.js +13 -3
- package/dist/server/public/videos-params.js.map +1 -1
- package/dist/server/public/videos.d.ts +1 -0
- package/dist/server/public/videos.js +21 -3
- package/dist/server/public/videos.js.map +1 -1
- package/dist/settings/schema/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 +1 -5
- package/src/settings/schema/llamacpp-upstream.json +9 -0
- package/src/settings/schema/sglang.json +251 -0
- package/dist/backend/catalog/bundled-manifest-baseline.d.ts +0 -2
- package/dist/backend/catalog/bundled-manifest-baseline.js +0 -65
- package/dist/backend/catalog/bundled-manifest-baseline.js.map +0 -1
- package/dist/contracts/model-setup.d.ts +0 -115
- package/dist/contracts/model-setup.js +0 -33
- package/dist/contracts/model-setup.js.map +0 -1
- package/dist/core/model-setup/index.d.ts +0 -4
- package/dist/core/model-setup/index.js +0 -5
- package/dist/core/model-setup/index.js.map +0 -1
- package/dist/core/model-setup/plan.d.ts +0 -56
- package/dist/core/model-setup/plan.js +0 -158
- package/dist/core/model-setup/plan.js.map +0 -1
- package/dist/core/model-setup/service.d.ts +0 -92
- package/dist/core/model-setup/service.js +0 -329
- package/dist/core/model-setup/service.js.map +0 -1
- package/dist/core/model-setup/store.d.ts +0 -29
- package/dist/core/model-setup/store.js +0 -116
- package/dist/core/model-setup/store.js.map +0 -1
- package/dist/core/model-setup/wiring.d.ts +0 -59
- package/dist/core/model-setup/wiring.js +0 -132
- package/dist/core/model-setup/wiring.js.map +0 -1
- package/dist/core/tensorrt-llm.d.ts +0 -169
- package/dist/core/tensorrt-llm.js +0 -428
- package/dist/core/tensorrt-llm.js.map +0 -1
- package/dist/downloads/segmented.d.ts +0 -40
- package/dist/downloads/segmented.js +0 -170
- package/dist/downloads/segmented.js.map +0 -1
- package/dist/runtime/tensorrt-llm/delete.d.ts +0 -15
- package/dist/runtime/tensorrt-llm/delete.js +0 -60
- package/dist/runtime/tensorrt-llm/delete.js.map +0 -1
- package/dist/runtime/tensorrt-llm/guest-files.d.ts +0 -8
- package/dist/runtime/tensorrt-llm/guest-files.js +0 -49
- package/dist/runtime/tensorrt-llm/guest-files.js.map +0 -1
- package/dist/runtime/tensorrt-llm/location.d.ts +0 -20
- package/dist/runtime/tensorrt-llm/location.js +0 -48
- package/dist/runtime/tensorrt-llm/location.js.map +0 -1
- package/dist/runtime/tensorrt-llm/model-dir.d.ts +0 -38
- package/dist/runtime/tensorrt-llm/model-dir.js +0 -137
- package/dist/runtime/tensorrt-llm/model-dir.js.map +0 -1
- package/dist/runtime/tensorrt-llm/quant-format.d.ts +0 -65
- package/dist/runtime/tensorrt-llm/quant-format.js +0 -189
- package/dist/runtime/tensorrt-llm/quant-format.js.map +0 -1
- package/dist/runtime/tensorrt-llm/registry.d.ts +0 -26
- package/dist/runtime/tensorrt-llm/registry.js +0 -68
- package/dist/runtime/tensorrt-llm/registry.js.map +0 -1
- package/dist/runtime/tensorrt-llm/runtime.d.ts +0 -130
- package/dist/runtime/tensorrt-llm/runtime.js +0 -395
- package/dist/runtime/tensorrt-llm/runtime.js.map +0 -1
- package/dist/server/control/routes/model-setups.d.ts +0 -11
- package/dist/server/control/routes/model-setups.js +0 -55
- package/dist/server/control/routes/model-setups.js.map +0 -1
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dashscope-image`: Alibaba Model Studio (DashScope) image models — Qwen-Image and Wan image — on the
|
|
3
|
+
* native API, Bearer key.
|
|
4
|
+
*
|
|
5
|
+
* The provider is registered with its OpenAI-compatible base
|
|
6
|
+
* `https://dashscope-intl.aliyuncs.com/compatible-mode/v1`; the native API lives on the same origin
|
|
7
|
+
* (the base cut after its host) under `/api/v1`. Every workflow (`create`, `edit`, `reference`) is
|
|
8
|
+
* the synchronous `POST {origin}/api/v1/services/aigc/multimodal-generation/generation`: one user
|
|
9
|
+
* message whose content is the input images (data URLs, the source first) and then the prompt. The
|
|
10
|
+
* answer points at signed image URLs on Alibaba's storage, downloaded without the key. The listing is
|
|
11
|
+
* `GET {origin}/api/v1/models?capabilities=IG`.
|
|
12
|
+
*/
|
|
13
|
+
import { callProvider, downloadResult, GENERATE_TIMEOUT_MS, MAX_IMAGE_BYTES, originOf, parseWxH, providerMessage, remoteError, remoteHttpError, sniffImageMime, toDataUrl, } from '../http.js';
|
|
14
|
+
const WORKFLOWS = ['create', 'edit', 'reference'];
|
|
15
|
+
const GENERATION_PATH = '/api/v1/services/aigc/multimodal-generation/generation';
|
|
16
|
+
/** Error codes (and words) DashScope uses when its content check refused the input or the output. */
|
|
17
|
+
const BLOCKED = /DataInspection|data_inspection|IPInfringement|inappropriate/i;
|
|
18
|
+
const isObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
19
|
+
const text = (value) => typeof value === 'string' && value !== '' ? value : undefined;
|
|
20
|
+
/** The native API's origin from the registered base: everything after the host goes. */
|
|
21
|
+
export function dashscopeOrigin(baseUrl) {
|
|
22
|
+
const origin = originOf(baseUrl);
|
|
23
|
+
if (!origin)
|
|
24
|
+
throw remoteError('REMOTE_NOT_CONFIGURED', 'The provider base URL is not a URL.', baseUrl);
|
|
25
|
+
return origin;
|
|
26
|
+
}
|
|
27
|
+
/** `size` as DashScope writes it: `W*H`, or a tier (`1K`, `2K`, `4K`) for a model that takes one. */
|
|
28
|
+
function sizeOf(job) {
|
|
29
|
+
const pixels = job.width && job.height ? { width: job.width, height: job.height } : parseWxH(job.size);
|
|
30
|
+
if (pixels)
|
|
31
|
+
return `${pixels.width}*${pixels.height}`;
|
|
32
|
+
return job.resolution || undefined;
|
|
33
|
+
}
|
|
34
|
+
/** The JSON body of a multimodal generation. */
|
|
35
|
+
export function dashscopeImageBody(job) {
|
|
36
|
+
const content = [];
|
|
37
|
+
if (job.workflow !== 'create')
|
|
38
|
+
for (const image of job.images)
|
|
39
|
+
content.push({ image: toDataUrl(image.bytes, image.mime) });
|
|
40
|
+
content.push({ text: job.prompt });
|
|
41
|
+
const parameters = { n: Math.max(1, job.n) };
|
|
42
|
+
const size = sizeOf(job);
|
|
43
|
+
if (size)
|
|
44
|
+
parameters['size'] = size;
|
|
45
|
+
if (job.negativePrompt && job.model.params.negative_prompt)
|
|
46
|
+
parameters['negative_prompt'] = job.negativePrompt;
|
|
47
|
+
parameters['prompt_extend'] = false;
|
|
48
|
+
parameters['watermark'] = false;
|
|
49
|
+
if (job.seed !== undefined && job.model.params.seed)
|
|
50
|
+
parameters['seed'] = job.seed;
|
|
51
|
+
return { model: job.model.id, input: { messages: [{ role: 'user', content }] }, parameters };
|
|
52
|
+
}
|
|
53
|
+
/** Every image URL of an answer, across all its choices. */
|
|
54
|
+
export function dashscopeImageUrls(json) {
|
|
55
|
+
const output = isObject(json) && isObject(json['output']) ? json['output'] : {};
|
|
56
|
+
const choices = Array.isArray(output['choices']) ? output['choices'] : [];
|
|
57
|
+
const urls = [];
|
|
58
|
+
for (const choice of choices) {
|
|
59
|
+
const message = isObject(choice) && isObject(choice['message']) ? choice['message'] : {};
|
|
60
|
+
const content = Array.isArray(message['content']) ? message['content'] : [];
|
|
61
|
+
for (const item of content) {
|
|
62
|
+
const url = isObject(item) ? text(item['image']) : undefined;
|
|
63
|
+
if (url)
|
|
64
|
+
urls.push(url);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return urls;
|
|
68
|
+
}
|
|
69
|
+
/** DashScope's error body (`{code, message, request_id}`) as the closest `REMOTE_*` error. */
|
|
70
|
+
export function dashscopeError(provider, status, json, body = '') {
|
|
71
|
+
const code = isObject(json) ? text(json['code']) : undefined;
|
|
72
|
+
const said = providerMessage(json, body);
|
|
73
|
+
const details = `HTTP ${status}${code ? ` ${code}` : ''}${said ? `: ${said}` : ''}`;
|
|
74
|
+
if ((code && BLOCKED.test(code)) || (said && BLOCKED.test(said)))
|
|
75
|
+
return remoteError('REMOTE_CONTENT_BLOCKED', `${provider} refused the request: ${said ?? code}`, details);
|
|
76
|
+
if (code === 'Arrearage')
|
|
77
|
+
return remoteError('REMOTE_QUOTA', `${provider} says the account is out of credit.`, details);
|
|
78
|
+
// The status decides the rest; the details keep DashScope's code.
|
|
79
|
+
const mapped = remoteHttpError(provider, status, json, body);
|
|
80
|
+
return remoteError(mapped.code, mapped.message, details);
|
|
81
|
+
}
|
|
82
|
+
/** The models of the native listing (`output.models[]`, or `data[]`), by `model` or `id`. */
|
|
83
|
+
export function dashscopeImageModels(json) {
|
|
84
|
+
const output = isObject(json) && isObject(json['output']) ? json['output'] : {};
|
|
85
|
+
const list = Array.isArray(output['models'])
|
|
86
|
+
? output['models']
|
|
87
|
+
: isObject(json) && Array.isArray(json['data'])
|
|
88
|
+
? json['data']
|
|
89
|
+
: isObject(json) && Array.isArray(json['models'])
|
|
90
|
+
? json['models']
|
|
91
|
+
: [];
|
|
92
|
+
const out = [];
|
|
93
|
+
const seen = new Set();
|
|
94
|
+
for (const item of list) {
|
|
95
|
+
if (!isObject(item))
|
|
96
|
+
continue;
|
|
97
|
+
const id = text(item['model']) ?? text(item['id']);
|
|
98
|
+
if (!id || seen.has(id))
|
|
99
|
+
continue;
|
|
100
|
+
seen.add(id);
|
|
101
|
+
const model = { id };
|
|
102
|
+
const name = text(item['name']);
|
|
103
|
+
if (name && name !== id)
|
|
104
|
+
model.name = name;
|
|
105
|
+
const description = text(item['description']);
|
|
106
|
+
if (description)
|
|
107
|
+
model.description = description;
|
|
108
|
+
out.push(model);
|
|
109
|
+
}
|
|
110
|
+
return out;
|
|
111
|
+
}
|
|
112
|
+
/** A file the provider pointed at, with the type its bytes say. Local: `http.ts` has no such helper. */
|
|
113
|
+
async function downloadImage(ctx, url) {
|
|
114
|
+
const file = await downloadResult(ctx, url, { maxBytes: MAX_IMAGE_BYTES, what: 'image' });
|
|
115
|
+
const mime = sniffImageMime(file.bytes);
|
|
116
|
+
if (!mime)
|
|
117
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} returned a file that is not an image.`);
|
|
118
|
+
return { bytes: file.bytes, mime };
|
|
119
|
+
}
|
|
120
|
+
export const DASHSCOPE_IMAGE = {
|
|
121
|
+
dialect: 'dashscope-image',
|
|
122
|
+
kind: 'image',
|
|
123
|
+
async listModels(ctx) {
|
|
124
|
+
const query = new URLSearchParams({ page_no: '1', page_size: '100', capabilities: 'IG' });
|
|
125
|
+
const url = `${dashscopeOrigin(ctx.baseUrl)}/api/v1/models?${query.toString()}`;
|
|
126
|
+
const answer = await callProvider(ctx, url, { accept: [400, 404] });
|
|
127
|
+
if (answer.status === 404)
|
|
128
|
+
return [];
|
|
129
|
+
if (answer.status === 400)
|
|
130
|
+
throw dashscopeError(ctx.provider, answer.status, answer.json, answer.text);
|
|
131
|
+
return dashscopeImageModels(answer.json);
|
|
132
|
+
},
|
|
133
|
+
async generate(ctx, job, report) {
|
|
134
|
+
if (!WORKFLOWS.includes(job.workflow))
|
|
135
|
+
throw remoteError('REMOTE_UNSUPPORTED', `${ctx.provider} does not support this workflow.`, job.workflow);
|
|
136
|
+
if (job.workflow !== 'create' && job.images.length === 0)
|
|
137
|
+
throw remoteError('REMOTE_UNSUPPORTED', 'This workflow needs a source image.', job.workflow);
|
|
138
|
+
const url = `${dashscopeOrigin(ctx.baseUrl)}${GENERATION_PATH}`;
|
|
139
|
+
report({ phase: 'generating' });
|
|
140
|
+
const answer = await callProvider(ctx, url, {
|
|
141
|
+
json: dashscopeImageBody(job),
|
|
142
|
+
timeoutMs: GENERATE_TIMEOUT_MS,
|
|
143
|
+
accept: [400],
|
|
144
|
+
});
|
|
145
|
+
if (answer.status === 400)
|
|
146
|
+
throw dashscopeError(ctx.provider, answer.status, answer.json, answer.text);
|
|
147
|
+
const urls = dashscopeImageUrls(answer.json);
|
|
148
|
+
if (urls.length === 0) {
|
|
149
|
+
// A 200 that carries an error code instead of images.
|
|
150
|
+
if (isObject(answer.json) && text(answer.json['code']))
|
|
151
|
+
throw dashscopeError(ctx.provider, 400, answer.json, answer.text);
|
|
152
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} answered without an image.`);
|
|
153
|
+
}
|
|
154
|
+
const out = [];
|
|
155
|
+
for (const image of urls)
|
|
156
|
+
out.push(await downloadImage(ctx, image));
|
|
157
|
+
return out;
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
//# sourceMappingURL=dashscope-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashscope-image.js","sourceRoot":"","sources":["../../../src/media/adapters/dashscope-image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dashscope-video`: Alibaba Cloud Model Studio's (DashScope) Wan video models. The provider is
|
|
3
|
+
* registered with its OpenAI-compatible base (`https://dashscope-intl.aliyuncs.com/compatible-mode/v1`,
|
|
4
|
+
* or a workspace host); video lives on DashScope's native API on the same origin, so every URL is
|
|
5
|
+
* `originOf(base)` + a native path.
|
|
6
|
+
*
|
|
7
|
+
* - submit → `POST {origin}/api/v1/services/aigc/video-generation/video-synthesis` with
|
|
8
|
+
* `X-DashScope-Async: enable` (required: the API is asynchronous only) and `{model, input:{prompt,
|
|
9
|
+
* negative_prompt, img_url | media}, parameters:{resolution | size, ratio, duration, prompt_extend,
|
|
10
|
+
* watermark, seed}}` → `{output:{task_id, task_status}}`. Wan 2.7 takes its frames as `media`
|
|
11
|
+
* (`first_frame`, `last_frame`) and `resolution` + `ratio`; older models take `img_url` and `size`
|
|
12
|
+
* (`1280*720`) or a `resolution` tier;
|
|
13
|
+
* - poll → `GET {origin}/api/v1/tasks/{task_id}` → `output.task_status` PENDING | RUNNING | SUCCEEDED |
|
|
14
|
+
* FAILED | CANCELED | UNKNOWN (expired, past 24 h), `output.video_url` once it succeeded,
|
|
15
|
+
* `output.code`/`output.message` once it failed;
|
|
16
|
+
* - download → `output.video_url`, a signed link valid for 24 h;
|
|
17
|
+
* - cancel → `POST {origin}/api/v1/tasks/{task_id}/cancel` (only a pending task; errors are ignored);
|
|
18
|
+
* - listing → `GET {origin}/api/v1/models?capabilities=VG` (`output.models[]`).
|
|
19
|
+
*
|
|
20
|
+
* DashScope names its errors by `code` (`InvalidParameter`, `DataInspectionFailed`, `Arrearage`, …);
|
|
21
|
+
* `dashscopeCodeKind` reads those before the HTTP status.
|
|
22
|
+
*/
|
|
23
|
+
import type { AtomicCoreError, DiffusionErrorCode } from '../../contracts/index.js';
|
|
24
|
+
import type { LiveMediaModel } from '../catalog.js';
|
|
25
|
+
import type { VideoAdapter, VideoGenerationJob } from './types.js';
|
|
26
|
+
type Fields = Record<string, unknown>;
|
|
27
|
+
/** DashScope's native API origin: the registered base's (`…/compatible-mode/v1` → its origin). */
|
|
28
|
+
export declare function dashscopeOrigin(baseUrl: string): string;
|
|
29
|
+
/** What a DashScope error `code` says, before the HTTP status does; `undefined` when it says nothing known. */
|
|
30
|
+
export declare function dashscopeCodeKind(code: string | undefined): DiffusionErrorCode | undefined;
|
|
31
|
+
/** A DashScope failure (an HTTP error body, a failed task's `output`) with its code and words. */
|
|
32
|
+
export declare function dashscopeError(provider: string, code: string | undefined, said: string | undefined, fallback: DiffusionErrorCode, status?: number): AtomicCoreError;
|
|
33
|
+
/** A non-2xx answer: its `code` when DashScope gave a known one, the status otherwise. */
|
|
34
|
+
export declare function dashscopeHttpError(provider: string, status: number, body: unknown, text?: string): AtomicCoreError;
|
|
35
|
+
/**
|
|
36
|
+
* The submit body: what the job set and the model offers. Prompt rewriting and the watermark are off,
|
|
37
|
+
* so the clip is what the prompt says.
|
|
38
|
+
*/
|
|
39
|
+
export declare function dashscopeVideoBody(job: VideoGenerationJob): Fields;
|
|
40
|
+
/**
|
|
41
|
+
* The video models of a `/api/v1/models` listing (`output.models[]`, tolerating `data[]`/`models[]`):
|
|
42
|
+
* those that generate video and whose id says text or image to video (a reference, editing or
|
|
43
|
+
* animation model takes inputs this adapter does not send).
|
|
44
|
+
*/
|
|
45
|
+
export declare function dashscopeVideoModels(json: unknown): LiveMediaModel[];
|
|
46
|
+
export declare const DASHSCOPE_VIDEO: VideoAdapter;
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dashscope-video`: Alibaba Cloud Model Studio's (DashScope) Wan video models. The provider is
|
|
3
|
+
* registered with its OpenAI-compatible base (`https://dashscope-intl.aliyuncs.com/compatible-mode/v1`,
|
|
4
|
+
* or a workspace host); video lives on DashScope's native API on the same origin, so every URL is
|
|
5
|
+
* `originOf(base)` + a native path.
|
|
6
|
+
*
|
|
7
|
+
* - submit → `POST {origin}/api/v1/services/aigc/video-generation/video-synthesis` with
|
|
8
|
+
* `X-DashScope-Async: enable` (required: the API is asynchronous only) and `{model, input:{prompt,
|
|
9
|
+
* negative_prompt, img_url | media}, parameters:{resolution | size, ratio, duration, prompt_extend,
|
|
10
|
+
* watermark, seed}}` → `{output:{task_id, task_status}}`. Wan 2.7 takes its frames as `media`
|
|
11
|
+
* (`first_frame`, `last_frame`) and `resolution` + `ratio`; older models take `img_url` and `size`
|
|
12
|
+
* (`1280*720`) or a `resolution` tier;
|
|
13
|
+
* - poll → `GET {origin}/api/v1/tasks/{task_id}` → `output.task_status` PENDING | RUNNING | SUCCEEDED |
|
|
14
|
+
* FAILED | CANCELED | UNKNOWN (expired, past 24 h), `output.video_url` once it succeeded,
|
|
15
|
+
* `output.code`/`output.message` once it failed;
|
|
16
|
+
* - download → `output.video_url`, a signed link valid for 24 h;
|
|
17
|
+
* - cancel → `POST {origin}/api/v1/tasks/{task_id}/cancel` (only a pending task; errors are ignored);
|
|
18
|
+
* - listing → `GET {origin}/api/v1/models?capabilities=VG` (`output.models[]`).
|
|
19
|
+
*
|
|
20
|
+
* DashScope names its errors by `code` (`InvalidParameter`, `DataInspectionFailed`, `Arrearage`, …);
|
|
21
|
+
* `dashscopeCodeKind` reads those before the HTTP status.
|
|
22
|
+
*/
|
|
23
|
+
import { callProvider, downloadResult, MAX_VIDEO_BYTES, originOf, parseWxH, providerMessage, remoteError, remoteHttpError, sniffVideoMime, toDataUrl, } from '../http.js';
|
|
24
|
+
const fields = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
25
|
+
const textOf = (value) => typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;
|
|
26
|
+
const SUBMIT_PATH = '/api/v1/services/aigc/video-generation/video-synthesis';
|
|
27
|
+
/** Wan 2.7 speaks the newer protocol: frames as `media`, `resolution` + `ratio`. */
|
|
28
|
+
const MEDIA_PROTOCOL = /wan2\.7/i;
|
|
29
|
+
/** DashScope's native API origin: the registered base's (`…/compatible-mode/v1` → its origin). */
|
|
30
|
+
export function dashscopeOrigin(baseUrl) {
|
|
31
|
+
return originOf(baseUrl) ?? baseUrl.replace(/\/+$/, '');
|
|
32
|
+
}
|
|
33
|
+
/** What a DashScope error `code` says, before the HTTP status does; `undefined` when it says nothing known. */
|
|
34
|
+
export function dashscopeCodeKind(code) {
|
|
35
|
+
if (!code)
|
|
36
|
+
return undefined;
|
|
37
|
+
if (/DataInspection|IPInfringement|Inappropriate|Sensitive|GreenNet/i.test(code))
|
|
38
|
+
return 'REMOTE_CONTENT_BLOCKED';
|
|
39
|
+
if (/Throttling|RateLimit|RateQuota/i.test(code))
|
|
40
|
+
return 'REMOTE_RATE_LIMITED';
|
|
41
|
+
if (/Arrearage|Quota|Balance|FreeTierOnly|Overdue/i.test(code))
|
|
42
|
+
return 'REMOTE_QUOTA';
|
|
43
|
+
if (/ApiKey|AccessDenied|Unauthorized|NoPermission|Forbidden/i.test(code))
|
|
44
|
+
return 'REMOTE_AUTH_FAILED';
|
|
45
|
+
if (/InvalidParameter|InvalidURL|InvalidFile|InvalidImage|BadRequest|ModelNotFound|NotSupported/i.test(code))
|
|
46
|
+
return 'REMOTE_REJECTED';
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
/** A DashScope failure (an HTTP error body, a failed task's `output`) with its code and words. */
|
|
50
|
+
export function dashscopeError(provider, code, said, fallback, status) {
|
|
51
|
+
const kind = dashscopeCodeKind(code) ?? fallback;
|
|
52
|
+
const details = [status === undefined ? undefined : `HTTP ${status}`, code, said].filter(Boolean).join(': ');
|
|
53
|
+
const message = said ? `${provider}: ${said}` : `${provider} failed${code ? ` (${code})` : ''}.`;
|
|
54
|
+
return remoteError(kind, message, details || undefined);
|
|
55
|
+
}
|
|
56
|
+
/** A non-2xx answer: its `code` when DashScope gave a known one, the status otherwise. */
|
|
57
|
+
export function dashscopeHttpError(provider, status, body, text = '') {
|
|
58
|
+
const generic = remoteHttpError(provider, status, body, text);
|
|
59
|
+
const code = textOf(fields(body)['code']);
|
|
60
|
+
if (!dashscopeCodeKind(code))
|
|
61
|
+
return generic;
|
|
62
|
+
return dashscopeError(provider, code, providerMessage(body, text), generic.code, status);
|
|
63
|
+
}
|
|
64
|
+
/** Statuses read with `dashscopeHttpError` instead of the generic mapping. */
|
|
65
|
+
const CODED_STATUSES = [400, 401, 403, 404, 429];
|
|
66
|
+
/** One request on the native API, its error `code` read before the status. */
|
|
67
|
+
async function callNative(ctx, path, options = {}) {
|
|
68
|
+
const answer = await callProvider(ctx, `${dashscopeOrigin(ctx.baseUrl)}${path}`, {
|
|
69
|
+
...options,
|
|
70
|
+
accept: CODED_STATUSES,
|
|
71
|
+
});
|
|
72
|
+
if (answer.status >= 300)
|
|
73
|
+
throw dashscopeHttpError(ctx.provider, answer.status, answer.json, answer.text);
|
|
74
|
+
return fields(answer.json);
|
|
75
|
+
}
|
|
76
|
+
/** The workflow is the model's, and image to video has the frames it needs. */
|
|
77
|
+
function checkInputs(job) {
|
|
78
|
+
if (!job.model.workflows.includes(job.workflow))
|
|
79
|
+
throw remoteError('REMOTE_UNSUPPORTED', `${job.model.name} cannot do ${job.workflow}.`, job.workflow);
|
|
80
|
+
if (job.workflow !== 'image-to-video')
|
|
81
|
+
return;
|
|
82
|
+
if (!job.firstFrame)
|
|
83
|
+
throw remoteError('REMOTE_UNSUPPORTED', 'Image to video needs a first frame.');
|
|
84
|
+
if (job.lastFrame && (!job.model.params.last_frame || !MEDIA_PROTOCOL.test(job.model.id)))
|
|
85
|
+
throw remoteError('REMOTE_UNSUPPORTED', `${job.model.name} does not take a last frame.`);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* The submit body: what the job set and the model offers. Prompt rewriting and the watermark are off,
|
|
89
|
+
* so the clip is what the prompt says.
|
|
90
|
+
*/
|
|
91
|
+
export function dashscopeVideoBody(job) {
|
|
92
|
+
checkInputs(job);
|
|
93
|
+
const params = job.model.params;
|
|
94
|
+
const input = { prompt: job.prompt };
|
|
95
|
+
if (job.negativePrompt && params.negative_prompt)
|
|
96
|
+
input['negative_prompt'] = job.negativePrompt;
|
|
97
|
+
if (job.workflow === 'image-to-video' && job.firstFrame) {
|
|
98
|
+
const first = toDataUrl(job.firstFrame.bytes, job.firstFrame.mime);
|
|
99
|
+
if (MEDIA_PROTOCOL.test(job.model.id)) {
|
|
100
|
+
const media = [{ type: 'first_frame', url: first }];
|
|
101
|
+
if (job.lastFrame)
|
|
102
|
+
media.push({ type: 'last_frame', url: toDataUrl(job.lastFrame.bytes, job.lastFrame.mime) });
|
|
103
|
+
input['media'] = media;
|
|
104
|
+
}
|
|
105
|
+
else
|
|
106
|
+
input['img_url'] = first;
|
|
107
|
+
}
|
|
108
|
+
const parameters = {};
|
|
109
|
+
if (job.resolution && params.resolutions)
|
|
110
|
+
parameters['resolution'] = job.resolution;
|
|
111
|
+
const size = parseWxH(job.size);
|
|
112
|
+
if (size && params.sizes)
|
|
113
|
+
parameters['size'] = `${size.width}*${size.height}`;
|
|
114
|
+
if (job.aspectRatio && params.aspect_ratios && job.workflow === 'create')
|
|
115
|
+
parameters['ratio'] = job.aspectRatio;
|
|
116
|
+
if (job.durationSecs !== undefined && params.durations)
|
|
117
|
+
parameters['duration'] = Math.round(job.durationSecs);
|
|
118
|
+
parameters['prompt_extend'] = false;
|
|
119
|
+
parameters['watermark'] = false;
|
|
120
|
+
if (job.seed !== undefined && params.seed)
|
|
121
|
+
parameters['seed'] = job.seed;
|
|
122
|
+
return { model: job.model.id, input, parameters };
|
|
123
|
+
}
|
|
124
|
+
/** What a model id says it does: `…t2v…` makes clips from text, `…i2v…` from a frame. */
|
|
125
|
+
function workflowOf(id) {
|
|
126
|
+
if (/i2v/i.test(id))
|
|
127
|
+
return 'image-to-video';
|
|
128
|
+
if (/t2v/i.test(id))
|
|
129
|
+
return 'create';
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* The video models of a `/api/v1/models` listing (`output.models[]`, tolerating `data[]`/`models[]`):
|
|
134
|
+
* those that generate video and whose id says text or image to video (a reference, editing or
|
|
135
|
+
* animation model takes inputs this adapter does not send).
|
|
136
|
+
*/
|
|
137
|
+
export function dashscopeVideoModels(json) {
|
|
138
|
+
const body = fields(json);
|
|
139
|
+
const output = fields(body['output']);
|
|
140
|
+
const list = [output['models'], body['data'], body['models']].find(Array.isArray) ?? [];
|
|
141
|
+
const out = [];
|
|
142
|
+
const seen = new Set();
|
|
143
|
+
for (const item of list) {
|
|
144
|
+
const entry = fields(item);
|
|
145
|
+
const id = textOf(entry['model']) ?? textOf(entry['id']);
|
|
146
|
+
if (!id || seen.has(id))
|
|
147
|
+
continue;
|
|
148
|
+
const capabilities = entry['capabilities'];
|
|
149
|
+
if (Array.isArray(capabilities) &&
|
|
150
|
+
!capabilities.some((c) => typeof c === 'string' && c.toUpperCase() === 'VG'))
|
|
151
|
+
continue;
|
|
152
|
+
const workflow = workflowOf(id);
|
|
153
|
+
if (!workflow)
|
|
154
|
+
continue;
|
|
155
|
+
seen.add(id);
|
|
156
|
+
const model = { id, workflows: [workflow] };
|
|
157
|
+
const name = textOf(entry['name']);
|
|
158
|
+
if (name)
|
|
159
|
+
model.name = name;
|
|
160
|
+
const description = textOf(entry['description']);
|
|
161
|
+
if (description)
|
|
162
|
+
model.description = description;
|
|
163
|
+
out.push(model);
|
|
164
|
+
}
|
|
165
|
+
return out;
|
|
166
|
+
}
|
|
167
|
+
/** A clip the provider pointed at, refused unless its bytes are a video. */
|
|
168
|
+
async function fetchClip(ctx, url) {
|
|
169
|
+
const file = await downloadResult(ctx, url, { maxBytes: MAX_VIDEO_BYTES, what: 'video' });
|
|
170
|
+
const mime = sniffVideoMime(file.bytes);
|
|
171
|
+
if (!mime)
|
|
172
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} returned a file that is not a video.`, file.mime || undefined);
|
|
173
|
+
return { bytes: file.bytes, mime };
|
|
174
|
+
}
|
|
175
|
+
export const DASHSCOPE_VIDEO = {
|
|
176
|
+
dialect: 'dashscope-video',
|
|
177
|
+
kind: 'video',
|
|
178
|
+
// DashScope suggests polling about every 15 seconds.
|
|
179
|
+
pollIntervalMs: { first: 10000, max: 20000 },
|
|
180
|
+
async listModels(ctx) {
|
|
181
|
+
const answer = await callProvider(ctx, `${dashscopeOrigin(ctx.baseUrl)}/api/v1/models?page_no=1&page_size=100&capabilities=VG`, { accept: [404] });
|
|
182
|
+
if (answer.status === 404)
|
|
183
|
+
return [];
|
|
184
|
+
return dashscopeVideoModels(answer.json);
|
|
185
|
+
},
|
|
186
|
+
async submit(ctx, job) {
|
|
187
|
+
const body = await callNative(ctx, SUBMIT_PATH, {
|
|
188
|
+
json: dashscopeVideoBody(job),
|
|
189
|
+
headers: { 'X-DashScope-Async': 'enable' },
|
|
190
|
+
});
|
|
191
|
+
const id = textOf(fields(body['output'])['task_id']);
|
|
192
|
+
if (!id) {
|
|
193
|
+
const code = textOf(body['code']);
|
|
194
|
+
if (code)
|
|
195
|
+
throw dashscopeError(ctx.provider, code, textOf(body['message']), 'REMOTE_REJECTED');
|
|
196
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} answered without a task id.`);
|
|
197
|
+
}
|
|
198
|
+
return { id };
|
|
199
|
+
},
|
|
200
|
+
async poll(ctx, submission) {
|
|
201
|
+
const body = await callNative(ctx, `/api/v1/tasks/${encodeURIComponent(submission.id)}`);
|
|
202
|
+
const output = fields(body['output']);
|
|
203
|
+
const status = (textOf(output['task_status']) ?? '').toUpperCase();
|
|
204
|
+
switch (status) {
|
|
205
|
+
case 'PENDING':
|
|
206
|
+
return { state: 'queued' };
|
|
207
|
+
case 'SUCCEEDED': {
|
|
208
|
+
const url = textOf(output['video_url']);
|
|
209
|
+
if (!url)
|
|
210
|
+
return {
|
|
211
|
+
state: 'failed',
|
|
212
|
+
error: remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} finished without a clip.`),
|
|
213
|
+
};
|
|
214
|
+
return { state: 'completed', result: { url } };
|
|
215
|
+
}
|
|
216
|
+
case 'FAILED':
|
|
217
|
+
return {
|
|
218
|
+
state: 'failed',
|
|
219
|
+
error: dashscopeError(ctx.provider, textOf(output['code']), textOf(output['message']), 'REMOTE_UNAVAILABLE'),
|
|
220
|
+
};
|
|
221
|
+
case 'CANCELED':
|
|
222
|
+
case 'CANCELLED':
|
|
223
|
+
return {
|
|
224
|
+
state: 'failed',
|
|
225
|
+
error: remoteError('CANCELLED', `${ctx.provider} cancelled the generation.`),
|
|
226
|
+
};
|
|
227
|
+
case 'UNKNOWN':
|
|
228
|
+
return {
|
|
229
|
+
state: 'failed',
|
|
230
|
+
error: remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} no longer knows this task (tasks expire after 24 hours).`),
|
|
231
|
+
};
|
|
232
|
+
default:
|
|
233
|
+
return { state: 'running' };
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
async download(ctx, _submission, result) {
|
|
237
|
+
if (!result.url)
|
|
238
|
+
throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} gave no clip to download.`);
|
|
239
|
+
return fetchClip(ctx, result.url);
|
|
240
|
+
},
|
|
241
|
+
async cancel(ctx, submission) {
|
|
242
|
+
try {
|
|
243
|
+
await callProvider(ctx, `${dashscopeOrigin(ctx.baseUrl)}/api/v1/tasks/${encodeURIComponent(submission.id)}/cancel`, { method: 'POST' });
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
// Only a pending task can be cancelled; a running one just finishes.
|
|
247
|
+
ctx.log('debug', `${ctx.provider}: cancel of ${submission.id} refused: ${error.message}`);
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
//# sourceMappingURL=dashscope-video.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashscope-video.js","sourceRoot":"","sources":["../../../src/media/adapters/dashscope-video.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `gemini-image`: Google's Gemini image models (Nano Banana) on the native Generative Language API,
|
|
3
|
+
* key in `x-goog-api-key`.
|
|
4
|
+
*
|
|
5
|
+
* The provider is registered with its OpenAI-compatible base
|
|
6
|
+
* `https://generativelanguage.googleapis.com/v1beta/openai`; the native base is that URL without its
|
|
7
|
+
* trailing `/openai` (a base registered without it is used as it is). Every workflow (`create`,
|
|
8
|
+
* `edit`, `reference`) is `POST {native}/models/{model}:generateContent`: the prompt, then each input
|
|
9
|
+
* image inline. The size goes in `generationConfig.imageConfig` (the SDK's field) or, when the model's
|
|
10
|
+
* `options.image_config_field` is `responseFormat`, in `generationConfig.responseFormat.image`.
|
|
11
|
+
* There is no batch field, so `n` images are `n` calls in a row. The listing is
|
|
12
|
+
* `GET {native}/models`, kept to the image models that answer `generateContent`.
|
|
13
|
+
*/
|
|
14
|
+
import type { AtomicCoreError } from '../../contracts/index.js';
|
|
15
|
+
import type { LiveMediaModel } from '../catalog.js';
|
|
16
|
+
import type { GeneratedImage, ImageAdapter, ImageGenerationJob } from './types.js';
|
|
17
|
+
/** The native API's base from the registered one: `…/v1beta/openai` → `…/v1beta`. */
|
|
18
|
+
export declare function geminiNativeBase(baseUrl: string): string;
|
|
19
|
+
/** The JSON body of `generateContent` for one image. */
|
|
20
|
+
export declare function geminiImageBody(job: ImageGenerationJob): Record<string, unknown>;
|
|
21
|
+
/** The images of a `generateContent` answer, or the `REMOTE_*` error it amounts to. */
|
|
22
|
+
export declare function geminiImages(provider: string, json: unknown): GeneratedImage[];
|
|
23
|
+
/** A non-2xx answer: Google's 400 for a bad key is an auth failure; the rest as `remoteHttpError`. */
|
|
24
|
+
export declare function geminiHttpError(provider: string, status: number, json: unknown, body?: string): AtomicCoreError;
|
|
25
|
+
/** The image models of `GET /models` that answer `generateContent`, without the `models/` prefix. */
|
|
26
|
+
export declare function geminiImageModels(json: unknown): LiveMediaModel[];
|
|
27
|
+
export declare const GEMINI_IMAGE: ImageAdapter;
|