@ai-sdk/alibaba 2.0.33 → 2.0.35
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/CHANGELOG.md +17 -0
- package/dist/index.d.ts +14 -9
- package/dist/index.js +72 -30
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/src/alibaba-video-model-options.ts +32 -10
- package/src/alibaba-video-model.ts +98 -31
- package/src/alibaba-video-settings.ts +2 -0
- package/src/convert-alibaba-usage.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @ai-sdk/alibaba
|
|
2
2
|
|
|
3
|
+
## 2.0.35
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 3789213: feat(provider/alibaba): support wan3 all-in-one video generation
|
|
8
|
+
- 2214258: Prevent negative text output token counts when providers report reasoning tokens. Perplexity reasoning tokens are now treated as separate from completion tokens.
|
|
9
|
+
- Updated dependencies [591d25b]
|
|
10
|
+
- @ai-sdk/provider@4.0.8
|
|
11
|
+
- @ai-sdk/provider-utils@5.0.30
|
|
12
|
+
|
|
13
|
+
## 2.0.34
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- Updated dependencies [b74971f]
|
|
18
|
+
- @ai-sdk/provider-utils@5.0.29
|
|
19
|
+
|
|
3
20
|
## 2.0.33
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -29,7 +29,7 @@ declare const alibabaEmbeddingModelOptions: z.ZodObject<{
|
|
|
29
29
|
}, z.core.$strip>;
|
|
30
30
|
type AlibabaEmbeddingModelOptions = z.infer<typeof alibabaEmbeddingModelOptions>;
|
|
31
31
|
|
|
32
|
-
type AlibabaVideoModelId = 'wan2.6-t2v' | 'wan2.5-t2v-preview' | 'wan2.7-t2v' | 'wan2.7-t2v-2026-06-12' | 'wan2.6-i2v' | 'wan2.6-i2v-flash' | 'wan2.6-r2v' | 'wan2.6-r2v-flash' | 'wan2.7-r2v' | 'wan2.7-r2v-2026-06-12' | (string & {});
|
|
32
|
+
type AlibabaVideoModelId = 'wan2.6-t2v' | 'wan2.5-t2v-preview' | 'wan2.7-t2v' | 'wan2.7-t2v-2026-06-12' | 'wan2.6-i2v' | 'wan2.6-i2v-flash' | 'wan2.6-r2v' | 'wan2.6-r2v-flash' | 'wan2.7-r2v' | 'wan2.7-r2v-2026-06-12' | 'wan3.0-video' | (string & {});
|
|
33
33
|
|
|
34
34
|
interface AlibabaProvider extends ProviderV4 {
|
|
35
35
|
(modelId: AlibabaChatModelId): LanguageModelV4;
|
|
@@ -119,8 +119,8 @@ type AlibabaVideoModelOptions = {
|
|
|
119
119
|
/** Whether to add watermark to generated video. Defaults to false. */
|
|
120
120
|
watermark?: boolean | null;
|
|
121
121
|
/**
|
|
122
|
-
* Enable audio generation (
|
|
123
|
-
* wan2.7 models always generate audio).
|
|
122
|
+
* Enable audio generation (wan2.6 I2V/R2V and wan3 models;
|
|
123
|
+
* wan2.7 models always generate audio). Defaults to true on wan3.
|
|
124
124
|
*/
|
|
125
125
|
audio?: boolean | null;
|
|
126
126
|
/**
|
|
@@ -130,22 +130,27 @@ type AlibabaVideoModelOptions = {
|
|
|
130
130
|
*/
|
|
131
131
|
referenceUrls?: string[] | null;
|
|
132
132
|
/**
|
|
133
|
-
* Explicit media array
|
|
134
|
-
*
|
|
133
|
+
* Explicit media array (wan2.7 and wan3 models). Overrides the automatic
|
|
134
|
+
* mapping from `inputReferences` and `frameImages`.
|
|
135
135
|
* Use `Image 1`, `Video 1`, etc. in prompts to reference media items
|
|
136
|
-
* (images and
|
|
136
|
+
* (images, videos, and audio are counted separately, in array order).
|
|
137
|
+
*
|
|
138
|
+
* `reference_audio`, `file`, and `link` are wan3-only and have no top-level
|
|
139
|
+
* call option, so they can only be passed here. wan3 also rejects mixing
|
|
140
|
+
* `reference_*`/`file`/`link` with `first_frame`/`last_frame`.
|
|
137
141
|
*/
|
|
138
142
|
media?: Array<{
|
|
139
|
-
type: 'reference_image' | 'reference_video' | 'first_frame';
|
|
143
|
+
type: 'reference_image' | 'reference_video' | 'reference_audio' | 'first_frame' | 'last_frame' | 'file' | 'link';
|
|
140
144
|
/** Public URL, or a `data:{mime};base64,{data}` URI for images. */
|
|
141
145
|
url: string;
|
|
142
146
|
/** URL to an audio file used as voice reference for this media item. */
|
|
143
147
|
referenceVoice?: string | null;
|
|
144
148
|
}> | null;
|
|
145
149
|
/**
|
|
146
|
-
* Aspect ratio (wan2.7 text-to-video and reference-to-video models
|
|
150
|
+
* Aspect ratio (wan2.7 text-to-video and reference-to-video models, and
|
|
151
|
+
* every wan3 generation). `adaptive` is wan3-only, and is its default.
|
|
147
152
|
*/
|
|
148
|
-
ratio?: '16:9' | '9:16' | '1:1' | '4:3' | '3:4' | null;
|
|
153
|
+
ratio?: 'adaptive' | '16:9' | '9:16' | '1:1' | '4:3' | '3:4' | null;
|
|
149
154
|
/** Polling interval in milliseconds. Defaults to 5000 (5 seconds). */
|
|
150
155
|
pollIntervalMs?: number | null;
|
|
151
156
|
/** Maximum wait time in milliseconds for video generation. Defaults to 600000 (10 minutes). */
|
package/dist/index.js
CHANGED
|
@@ -144,7 +144,7 @@ function convertAlibabaUsage(usage) {
|
|
|
144
144
|
},
|
|
145
145
|
outputTokens: {
|
|
146
146
|
total: completionTokens,
|
|
147
|
-
text: completionTokens - reasoningTokens,
|
|
147
|
+
text: Math.max(0, completionTokens - reasoningTokens),
|
|
148
148
|
reasoning: reasoningTokens
|
|
149
149
|
},
|
|
150
150
|
raw: usage
|
|
@@ -975,12 +975,20 @@ var alibabaVideoModelOptionsSchema = lazySchema(
|
|
|
975
975
|
referenceUrls: z6.array(z6.string()).nullish(),
|
|
976
976
|
media: z6.array(
|
|
977
977
|
z6.object({
|
|
978
|
-
type: z6.enum([
|
|
978
|
+
type: z6.enum([
|
|
979
|
+
"reference_image",
|
|
980
|
+
"reference_video",
|
|
981
|
+
"reference_audio",
|
|
982
|
+
"first_frame",
|
|
983
|
+
"last_frame",
|
|
984
|
+
"file",
|
|
985
|
+
"link"
|
|
986
|
+
]),
|
|
979
987
|
url: z6.string(),
|
|
980
988
|
referenceVoice: z6.string().nullish()
|
|
981
989
|
})
|
|
982
990
|
).nullish(),
|
|
983
|
-
ratio: z6.enum(["16:9", "9:16", "1:1", "4:3", "3:4"]).nullish(),
|
|
991
|
+
ratio: z6.enum(["adaptive", "16:9", "9:16", "1:1", "4:3", "3:4"]).nullish(),
|
|
984
992
|
pollIntervalMs: z6.number().positive().nullish(),
|
|
985
993
|
pollTimeoutMs: z6.number().positive().nullish()
|
|
986
994
|
})
|
|
@@ -1020,8 +1028,12 @@ var alibabaVideoTaskStatusSchema = z7.object({
|
|
|
1020
1028
|
usage: z7.object({
|
|
1021
1029
|
duration: z7.number().nullish(),
|
|
1022
1030
|
output_video_duration: z7.number().nullish(),
|
|
1031
|
+
// wan3 splits the total: input video counts toward its 30s ceiling.
|
|
1032
|
+
input_video_duration: z7.number().nullish(),
|
|
1033
|
+
fps: z7.number().nullish(),
|
|
1023
1034
|
SR: z7.number().nullish(),
|
|
1024
|
-
size: z7.string().nullish()
|
|
1035
|
+
size: z7.string().nullish(),
|
|
1036
|
+
ratio: z7.string().nullish()
|
|
1025
1037
|
}).nullish(),
|
|
1026
1038
|
request_id: z7.string().nullish()
|
|
1027
1039
|
});
|
|
@@ -1030,8 +1042,10 @@ function detectMode(modelId) {
|
|
|
1030
1042
|
if (modelId.includes("-r2v")) return "r2v";
|
|
1031
1043
|
return "t2v";
|
|
1032
1044
|
}
|
|
1033
|
-
function
|
|
1034
|
-
|
|
1045
|
+
function detectProtocol(modelId) {
|
|
1046
|
+
if (modelId.startsWith("wan3")) return "wan3";
|
|
1047
|
+
if (modelId.startsWith("wan2.7")) return "wan27";
|
|
1048
|
+
return "legacy";
|
|
1035
1049
|
}
|
|
1036
1050
|
var resolutionTierMap = {
|
|
1037
1051
|
"1280x720": "720P",
|
|
@@ -1072,6 +1086,10 @@ function getFirstFrameImage(options) {
|
|
|
1072
1086
|
var _a, _b;
|
|
1073
1087
|
return (_b = (_a = options.frameImages) == null ? void 0 : _a.find((frame) => frame.frameType === "first_frame")) == null ? void 0 : _b.image;
|
|
1074
1088
|
}
|
|
1089
|
+
function getLastFrameImage(options) {
|
|
1090
|
+
var _a, _b;
|
|
1091
|
+
return (_b = (_a = options.frameImages) == null ? void 0 : _a.find((frame) => frame.frameType === "last_frame")) == null ? void 0 : _b.image;
|
|
1092
|
+
}
|
|
1075
1093
|
function resolveStartImage(options) {
|
|
1076
1094
|
var _a;
|
|
1077
1095
|
return (_a = getFirstFrameImage(options)) != null ? _a : options.image;
|
|
@@ -1079,7 +1097,7 @@ function resolveStartImage(options) {
|
|
|
1079
1097
|
function isVideoUrl(url) {
|
|
1080
1098
|
return /\.(mp4|mov)([?#]|$)/i.test(url);
|
|
1081
1099
|
}
|
|
1082
|
-
function resolveMedia(options, alibabaOptions, warnings) {
|
|
1100
|
+
function resolveMedia(options, alibabaOptions, warnings, frames) {
|
|
1083
1101
|
var _a;
|
|
1084
1102
|
if ((alibabaOptions == null ? void 0 : alibabaOptions.media) != null && alibabaOptions.media.length > 0) {
|
|
1085
1103
|
return alibabaOptions.media.map((item) => ({
|
|
@@ -1108,11 +1126,16 @@ function resolveMedia(options, alibabaOptions, warnings) {
|
|
|
1108
1126
|
});
|
|
1109
1127
|
}
|
|
1110
1128
|
}
|
|
1111
|
-
|
|
1112
|
-
if (firstFrame != null) {
|
|
1129
|
+
if (frames.first != null) {
|
|
1113
1130
|
media.push({
|
|
1114
1131
|
type: "first_frame",
|
|
1115
|
-
url: convertImageModelFileToDataUri(
|
|
1132
|
+
url: convertImageModelFileToDataUri(frames.first)
|
|
1133
|
+
});
|
|
1134
|
+
}
|
|
1135
|
+
if (frames.last != null) {
|
|
1136
|
+
media.push({
|
|
1137
|
+
type: "last_frame",
|
|
1138
|
+
url: convertImageModelFileToDataUri(frames.last)
|
|
1116
1139
|
});
|
|
1117
1140
|
}
|
|
1118
1141
|
return media.length > 0 ? media : void 0;
|
|
@@ -1150,7 +1173,7 @@ var AlibabaVideoModel = class {
|
|
|
1150
1173
|
return this.config.provider;
|
|
1151
1174
|
}
|
|
1152
1175
|
async buildRequest(options) {
|
|
1153
|
-
var _a, _b, _c
|
|
1176
|
+
var _a, _b, _c;
|
|
1154
1177
|
const warnings = [];
|
|
1155
1178
|
const mode = detectMode(this.modelId);
|
|
1156
1179
|
const alibabaOptions = await parseProviderOptions3({
|
|
@@ -1169,14 +1192,27 @@ var AlibabaVideoModel = class {
|
|
|
1169
1192
|
input.audio_url = alibabaOptions.audioUrl;
|
|
1170
1193
|
}
|
|
1171
1194
|
const startImage = resolveStartImage(options);
|
|
1172
|
-
const
|
|
1173
|
-
const
|
|
1174
|
-
|
|
1195
|
+
const protocol = detectProtocol(this.modelId);
|
|
1196
|
+
const wan27 = protocol === "wan27";
|
|
1197
|
+
const wan3 = protocol === "wan3";
|
|
1198
|
+
const tieredProtocol = wan27 || wan3;
|
|
1199
|
+
const supportsRatio = wan3 || wan27 && mode !== "i2v";
|
|
1200
|
+
if (!wan3 && mode === "i2v" && startImage != null) {
|
|
1175
1201
|
input.img_url = fileToImageString(startImage);
|
|
1176
1202
|
}
|
|
1177
|
-
if (
|
|
1203
|
+
if (wan3) {
|
|
1204
|
+
const media = resolveMedia(options, alibabaOptions, warnings, {
|
|
1205
|
+
first: startImage,
|
|
1206
|
+
last: getLastFrameImage(options)
|
|
1207
|
+
});
|
|
1208
|
+
if (media != null) {
|
|
1209
|
+
input.media = media;
|
|
1210
|
+
}
|
|
1211
|
+
} else if (mode === "r2v") {
|
|
1178
1212
|
if (wan27) {
|
|
1179
|
-
const media = resolveMedia(options, alibabaOptions, warnings
|
|
1213
|
+
const media = resolveMedia(options, alibabaOptions, warnings, {
|
|
1214
|
+
first: getFirstFrameImage(options)
|
|
1215
|
+
});
|
|
1180
1216
|
if (media != null) {
|
|
1181
1217
|
input.media = media;
|
|
1182
1218
|
}
|
|
@@ -1191,17 +1227,15 @@ var AlibabaVideoModel = class {
|
|
|
1191
1227
|
}
|
|
1192
1228
|
}
|
|
1193
1229
|
}
|
|
1194
|
-
const lastFrame = (
|
|
1195
|
-
|
|
1196
|
-
)) == null ? void 0 : _b.image;
|
|
1197
|
-
if (lastFrame != null) {
|
|
1230
|
+
const lastFrame = getLastFrameImage(options);
|
|
1231
|
+
if (lastFrame != null && !wan3) {
|
|
1198
1232
|
warnings.push({
|
|
1199
1233
|
type: "unsupported",
|
|
1200
1234
|
feature: "frameImages",
|
|
1201
1235
|
details: "This model does not support last_frame. The last frame image was ignored."
|
|
1202
1236
|
});
|
|
1203
1237
|
}
|
|
1204
|
-
if (options.inputReferences != null && options.inputReferences.length > 0 && mode !== "r2v") {
|
|
1238
|
+
if (options.inputReferences != null && options.inputReferences.length > 0 && mode !== "r2v" && !wan3) {
|
|
1205
1239
|
warnings.push({
|
|
1206
1240
|
type: "unsupported",
|
|
1207
1241
|
feature: "inputReferences",
|
|
@@ -1216,13 +1250,14 @@ var AlibabaVideoModel = class {
|
|
|
1216
1250
|
parameters.seed = options.seed;
|
|
1217
1251
|
}
|
|
1218
1252
|
if (options.resolution != null) {
|
|
1219
|
-
if (mode === "i2v" ||
|
|
1253
|
+
if (mode === "i2v" || tieredProtocol) {
|
|
1220
1254
|
const resolutionTier = resolutionTierMap[options.resolution] || options.resolution;
|
|
1221
|
-
|
|
1255
|
+
const supportedTiers = wan3 ? ["480P", "720P", "1080P"] : ["720P", "1080P"];
|
|
1256
|
+
if (tieredProtocol && !supportedTiers.includes(resolutionTier)) {
|
|
1222
1257
|
warnings.push({
|
|
1223
1258
|
type: "unsupported",
|
|
1224
1259
|
feature: "resolution",
|
|
1225
|
-
details:
|
|
1260
|
+
details: `${wan3 ? "wan3" : "wan2.7"} models only support the ${supportedTiers.join(", ")} resolution tiers. The resolution "${options.resolution}" was ignored.`
|
|
1226
1261
|
});
|
|
1227
1262
|
} else {
|
|
1228
1263
|
parameters.resolution = resolutionTier;
|
|
@@ -1232,7 +1267,7 @@ var AlibabaVideoModel = class {
|
|
|
1232
1267
|
}
|
|
1233
1268
|
}
|
|
1234
1269
|
if (supportsRatio) {
|
|
1235
|
-
const ratio = (
|
|
1270
|
+
const ratio = (_b = (_a = alibabaOptions == null ? void 0 : alibabaOptions.ratio) != null ? _a : options.aspectRatio) != null ? _b : options.resolution != null ? deriveRatioFromResolution(options.resolution) : void 0;
|
|
1236
1271
|
if (ratio != null) {
|
|
1237
1272
|
parameters.ratio = ratio;
|
|
1238
1273
|
}
|
|
@@ -1241,11 +1276,11 @@ var AlibabaVideoModel = class {
|
|
|
1241
1276
|
parameters.prompt_extend = alibabaOptions.promptExtend;
|
|
1242
1277
|
}
|
|
1243
1278
|
if ((alibabaOptions == null ? void 0 : alibabaOptions.shotType) != null) {
|
|
1244
|
-
if (
|
|
1279
|
+
if (tieredProtocol) {
|
|
1245
1280
|
warnings.push({
|
|
1246
1281
|
type: "unsupported",
|
|
1247
1282
|
feature: "shotType",
|
|
1248
|
-
details: "wan2.7 models do not support the shotType option. Describe the shot structure in the prompt instead
|
|
1283
|
+
details: `${wan3 ? "wan3" : "wan2.7"} models do not support the shotType option. Describe the shot structure in the prompt instead.`
|
|
1249
1284
|
});
|
|
1250
1285
|
} else {
|
|
1251
1286
|
parameters.shot_type = alibabaOptions.shotType;
|
|
@@ -1254,7 +1289,7 @@ var AlibabaVideoModel = class {
|
|
|
1254
1289
|
if ((alibabaOptions == null ? void 0 : alibabaOptions.watermark) != null) {
|
|
1255
1290
|
parameters.watermark = alibabaOptions.watermark;
|
|
1256
1291
|
}
|
|
1257
|
-
const audio = (
|
|
1292
|
+
const audio = (_c = options.generateAudio) != null ? _c : alibabaOptions == null ? void 0 : alibabaOptions.audio;
|
|
1258
1293
|
if (audio != null) {
|
|
1259
1294
|
if (wan27) {
|
|
1260
1295
|
warnings.push({
|
|
@@ -1324,7 +1359,14 @@ var AlibabaVideoModel = class {
|
|
|
1324
1359
|
duration: statusResponse.usage.duration,
|
|
1325
1360
|
outputVideoDuration: statusResponse.usage.output_video_duration,
|
|
1326
1361
|
resolution: statusResponse.usage.SR,
|
|
1327
|
-
size: statusResponse.usage.size
|
|
1362
|
+
size: statusResponse.usage.size,
|
|
1363
|
+
// wan3-only. Spread rather than set to undefined so the
|
|
1364
|
+
// metadata shape for older wan models is unchanged.
|
|
1365
|
+
...statusResponse.usage.input_video_duration != null ? {
|
|
1366
|
+
inputVideoDuration: statusResponse.usage.input_video_duration
|
|
1367
|
+
} : {},
|
|
1368
|
+
...statusResponse.usage.fps != null ? { fps: statusResponse.usage.fps } : {},
|
|
1369
|
+
...statusResponse.usage.ratio != null ? { ratio: statusResponse.usage.ratio } : {}
|
|
1328
1370
|
}
|
|
1329
1371
|
} : {}
|
|
1330
1372
|
}
|
|
@@ -1423,7 +1465,7 @@ var AlibabaVideoModel = class {
|
|
|
1423
1465
|
};
|
|
1424
1466
|
|
|
1425
1467
|
// src/version.ts
|
|
1426
|
-
var VERSION = true ? "2.0.
|
|
1468
|
+
var VERSION = true ? "2.0.35" : "0.0.0-test";
|
|
1427
1469
|
|
|
1428
1470
|
// src/alibaba-provider.ts
|
|
1429
1471
|
function createAlibaba(options = {}) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/alibaba-provider.ts","../src/alibaba-chat-language-model.ts","../src/alibaba-chat-language-model-options.ts","../src/alibaba-error.ts","../src/alibaba-prepare-tools.ts","../src/convert-alibaba-usage.ts","../src/convert-to-alibaba-chat-messages.ts","../src/get-cache-control.ts","../src/map-alibaba-finish-reason.ts","../src/alibaba-embedding-model.ts","../src/alibaba-embedding-model-options.ts","../src/alibaba-video-model.ts","../src/alibaba-video-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type EmbeddingModelV4,\n type Experimental_VideoModelV4,\n type LanguageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { AlibabaChatLanguageModel } from './alibaba-chat-language-model';\nimport type { AlibabaChatModelId } from './alibaba-chat-language-model-options';\nimport { AlibabaEmbeddingModel } from './alibaba-embedding-model';\nimport type { AlibabaEmbeddingModelId } from './alibaba-embedding-model-options';\nimport { AlibabaVideoModel } from './alibaba-video-model';\nimport type { AlibabaVideoModelId } from './alibaba-video-settings';\nimport { VERSION } from './version';\n\nexport type { AlibabaErrorData } from './alibaba-error';\nexport { alibabaFailedResponseHandler } from './alibaba-error';\n\nexport interface AlibabaProvider extends ProviderV4 {\n (modelId: AlibabaChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation.\n */\n languageModel(modelId: AlibabaChatModelId): LanguageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n chatModel(modelId: AlibabaChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text embeddings.\n */\n embedding(modelId: AlibabaEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * Creates a model for text embeddings.\n */\n embeddingModel(modelId: AlibabaEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * Creates a model for video generation.\n */\n video(modelId: AlibabaVideoModelId): Experimental_VideoModelV4;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: AlibabaVideoModelId): Experimental_VideoModelV4;\n}\n\nexport interface AlibabaProviderSettings {\n /**\n * Use a different URL prefix for API calls, e.g. to use proxy servers or regional endpoints.\n * The default prefix is `https://dashscope-intl.aliyuncs.com/compatible-mode/v1`.\n */\n baseURL?: string;\n\n /**\n * Use a different URL prefix for video generation API calls.\n * The video API uses the DashScope native endpoint (not the OpenAI-compatible endpoint).\n * The default prefix is `https://dashscope-intl.aliyuncs.com`.\n */\n videoBaseURL?: string;\n\n /**\n * Use a different URL prefix for embedding API calls.\n * The embedding API uses the DashScope native endpoint (not the OpenAI-compatible endpoint).\n * The default prefix is `https://dashscope-intl.aliyuncs.com/api/v1`.\n */\n embeddingBaseURL?: string;\n\n /**\n * API key that is being sent using the `Authorization` header.\n * It defaults to the `ALIBABA_API_KEY` environment variable.\n */\n apiKey?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * Include usage information in streaming responses.\n * When enabled, token usage will be included in the final chunk.\n *\n * @default true\n */\n includeUsage?: boolean;\n}\n\n/**\n * Create an Alibaba Cloud (Qwen) provider instance.\n */\nexport function createAlibaba(\n options: AlibabaProviderSettings = {},\n): AlibabaProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ??\n 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1';\n\n const videoBaseURL =\n withoutTrailingSlash(options.videoBaseURL) ??\n 'https://dashscope-intl.aliyuncs.com';\n\n const embeddingBaseURL =\n withoutTrailingSlash(options.embeddingBaseURL) ??\n 'https://dashscope-intl.aliyuncs.com/api/v1';\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'ALIBABA_API_KEY',\n description: 'Alibaba Cloud (DashScope)',\n })}`,\n ...options.headers,\n },\n `ai-sdk/alibaba/${VERSION}`,\n );\n\n const createLanguageModel = (modelId: AlibabaChatModelId) =>\n new AlibabaChatLanguageModel(modelId, {\n provider: 'alibaba.chat',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n includeUsage: options.includeUsage ?? true,\n });\n\n const createEmbeddingModel = (modelId: AlibabaEmbeddingModelId) =>\n new AlibabaEmbeddingModel(modelId, {\n provider: 'alibaba.embedding',\n baseURL: embeddingBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createVideoModel = (modelId: AlibabaVideoModelId) =>\n new AlibabaVideoModel(modelId, {\n provider: 'alibaba.video',\n baseURL: videoBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = function (modelId: AlibabaChatModelId) {\n if (new.target) {\n throw new Error(\n 'The Alibaba model function cannot be called with the new keyword.',\n );\n }\n\n return createLanguageModel(modelId);\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createLanguageModel;\n provider.chatModel = createLanguageModel;\n provider.embedding = createEmbeddingModel;\n provider.embeddingModel = createEmbeddingModel;\n provider.video = createVideoModel;\n provider.videoModel = createVideoModel;\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n\nexport const alibaba = createAlibaba();\n","import type {\n LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4Content,\n LanguageModelV4FinishReason,\n LanguageModelV4GenerateResult,\n LanguageModelV4StreamPart,\n LanguageModelV4StreamResult,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n createLanguageModelResponseMetadata as getResponseMetadata,\n generateId,\n isCustomReasoning,\n mapReasoningToProviderBudget,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n StreamingToolCallTracker,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type InferSchema,\n type ParseResult,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n alibabaLanguageModelChatOptions,\n type AlibabaChatModelId,\n} from './alibaba-chat-language-model-options';\nimport type { AlibabaConfig } from './alibaba-config';\nimport { alibabaFailedResponseHandler } from './alibaba-error';\nimport { prepareTools } from './alibaba-prepare-tools';\nimport { convertAlibabaUsage } from './convert-alibaba-usage';\nimport { convertToAlibabaChatMessages } from './convert-to-alibaba-chat-messages';\nimport { CacheControlValidator } from './get-cache-control';\nimport { mapAlibabaFinishReason } from './map-alibaba-finish-reason';\n\n/**\n * Alibaba language model implementation.\n *\n * Implements LanguageModelV4 interface for Alibaba Cloud's Qwen models.\n * Supports OpenAI-compatible chat completions API with Alibaba-specific features:\n * - Reasoning/thinking mode (enable_thinking, reasoning_content)\n * - Thinking budget control (thinking_budget)\n * - Prompt caching (cached_tokens tracking)\n */\nexport class AlibabaChatLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n readonly modelId: AlibabaChatModelId;\n\n private readonly config: AlibabaConfig;\n\n static [WORKFLOW_SERIALIZE](model: AlibabaChatLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: AlibabaChatModelId;\n config: AlibabaConfig;\n }) {\n return new AlibabaChatLanguageModel(options.modelId, options.config);\n }\n\n constructor(modelId: AlibabaChatModelId, config: AlibabaConfig) {\n this.modelId = modelId;\n this.config = config;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n readonly supportedUrls: Record<string, RegExp[]> = {\n 'image/*': [/^https?:\\/\\/.*$/],\n };\n\n /**\n * Builds request arguments for Alibaba API call.\n * Converts AI SDK options to Alibaba API format.\n */\n private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n responseFormat,\n seed,\n reasoning,\n providerOptions,\n tools,\n toolChoice,\n }: LanguageModelV4CallOptions) {\n const warnings: SharedV4Warning[] = [];\n\n const cacheControlValidator = new CacheControlValidator();\n\n const alibabaOptions = await parseProviderOptions({\n provider: 'alibaba',\n providerOptions,\n schema: alibabaLanguageModelChatOptions,\n });\n\n // Warn about unsupported features\n if (frequencyPenalty != null) {\n warnings.push({ type: 'unsupported', feature: 'frequencyPenalty' });\n }\n\n // Build base request arguments\n const baseArgs = {\n model: this.modelId,\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n top_k: topK,\n presence_penalty: presencePenalty,\n stop: stopSequences,\n seed,\n response_format:\n responseFormat?.type === 'json'\n ? responseFormat.schema != null\n ? {\n type: 'json_schema',\n json_schema: {\n schema: responseFormat.schema,\n name: responseFormat.name ?? 'response',\n description: responseFormat.description,\n },\n }\n : { type: 'json_object' }\n : undefined,\n\n ...resolveAlibabaThinking({\n reasoning,\n alibabaOptions,\n warnings,\n }),\n\n // Convert messages with cache control support\n messages: convertToAlibabaChatMessages({\n prompt,\n cacheControlValidator,\n }),\n };\n\n // Prepare tools\n const {\n tools: alibabaTools,\n toolChoice: alibabaToolChoice,\n toolWarnings,\n } = prepareTools({ tools, toolChoice });\n\n warnings.push(...cacheControlValidator.getWarnings());\n\n return {\n args: {\n ...baseArgs,\n tools: alibabaTools,\n tool_choice: alibabaToolChoice,\n ...(alibabaTools != null &&\n alibabaOptions?.parallelToolCalls !== undefined\n ? { parallel_tool_calls: alibabaOptions.parallelToolCalls }\n : {}),\n },\n warnings: [...warnings, ...toolWarnings],\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args, warnings } = await this.getArgs(options);\n\n const {\n responseHeaders,\n value: response,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body: args,\n failedResponseHandler: alibabaFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n alibabaChatResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = response.choices[0];\n const content: Array<LanguageModelV4Content> = [];\n\n // text content:\n const text = choice.message.content;\n if (text != null && text.length > 0) {\n content.push({ type: 'text', text });\n }\n\n // reasoning content (Alibaba uses 'reasoning_content' field):\n const reasoning = choice.message.reasoning_content;\n if (reasoning != null && reasoning.length > 0) {\n content.push({\n type: 'reasoning',\n text: reasoning,\n });\n }\n\n // tool calls:\n if (choice.message.tool_calls != null) {\n for (const toolCall of choice.message.tool_calls) {\n content.push({\n type: 'tool-call',\n toolCallId: toolCall.id || generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments!,\n });\n }\n }\n\n return {\n content,\n finishReason: {\n unified: mapAlibabaFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n },\n usage: convertAlibabaUsage(response.usage),\n request: { body: JSON.stringify(args) },\n response: {\n ...getResponseMetadata(response),\n headers: responseHeaders,\n body: rawResponse,\n },\n warnings,\n };\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const { args, warnings } = await this.getArgs(options);\n const body = {\n ...args,\n stream: true,\n stream_options: this.config.includeUsage\n ? { include_usage: true }\n : undefined,\n };\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body,\n failedResponseHandler: alibabaFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n alibabaChatChunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n // Track state across chunks\n let finishReason: LanguageModelV4FinishReason = {\n unified: 'other',\n raw: undefined,\n };\n let usage: z.infer<typeof alibabaUsageSchema> | undefined = undefined;\n\n let isFirstChunk = true;\n let activeText = false;\n let activeReasoningId: string | null = null;\n\n let toolCallTracker: StreamingToolCallTracker;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof alibabaChatChunkSchema>>,\n LanguageModelV4StreamPart\n >({\n start(controller) {\n toolCallTracker = new StreamingToolCallTracker(controller, {\n generateId,\n });\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n // Emit raw chunk if requested (before anything else)\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n // Handle parse errors\n if (!chunk.success) {\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n const value = chunk.value;\n\n // Emit response metadata on first chunk\n if (isFirstChunk) {\n isFirstChunk = false;\n controller.enqueue({\n type: 'response-metadata',\n ...getResponseMetadata(value),\n });\n }\n\n // Track usage (appears in final chunk)\n if (value.usage != null) {\n usage = value.usage;\n }\n\n // Skip processing if no choices (usage-only chunk)\n if (value.choices.length === 0) {\n return;\n }\n\n const choice = value.choices[0];\n const delta = choice.delta;\n\n // Handle reasoning content streaming (Alibaba thinking mode)\n if (\n delta.reasoning_content != null &&\n delta.reasoning_content.length > 0\n ) {\n if (activeReasoningId == null) {\n // End any active text before starting reasoning\n if (activeText) {\n controller.enqueue({ type: 'text-end', id: '0' });\n activeText = false;\n }\n\n activeReasoningId = generateId();\n controller.enqueue({\n type: 'reasoning-start',\n id: activeReasoningId,\n });\n }\n\n controller.enqueue({\n type: 'reasoning-delta',\n id: activeReasoningId,\n delta: delta.reasoning_content,\n });\n }\n\n // Handle text content streaming\n if (delta.content != null && delta.content.length > 0) {\n // End any active reasoning before starting text\n if (activeReasoningId != null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: activeReasoningId,\n });\n activeReasoningId = null;\n }\n\n if (!activeText) {\n controller.enqueue({ type: 'text-start', id: '0' });\n activeText = true;\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: '0',\n delta: delta.content,\n });\n }\n\n // Handle tool call streaming\n if (delta.tool_calls != null) {\n // End any active reasoning or text before tool calls\n if (activeReasoningId != null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: activeReasoningId,\n });\n activeReasoningId = null;\n }\n if (activeText) {\n controller.enqueue({ type: 'text-end', id: '0' });\n activeText = false;\n }\n\n for (const toolCallDelta of delta.tool_calls) {\n toolCallTracker.processDelta(toolCallDelta);\n }\n }\n\n // Track finish reason\n if (choice.finish_reason != null) {\n finishReason = {\n unified: mapAlibabaFinishReason(choice.finish_reason),\n raw: choice.finish_reason,\n };\n }\n },\n\n flush(controller) {\n if (activeReasoningId != null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: activeReasoningId,\n });\n }\n\n if (activeText) {\n controller.enqueue({ type: 'text-end', id: '0' });\n }\n\n toolCallTracker.flush();\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertAlibabaUsage(usage),\n });\n },\n }),\n ),\n request: { body: JSON.stringify(body) },\n response: { headers: responseHeaders },\n };\n }\n}\n\nfunction resolveAlibabaThinking({\n reasoning,\n alibabaOptions,\n warnings,\n}: {\n reasoning: LanguageModelV4CallOptions['reasoning'];\n alibabaOptions:\n | InferSchema<typeof alibabaLanguageModelChatOptions>\n | undefined;\n warnings: SharedV4Warning[];\n}): { enable_thinking?: boolean; thinking_budget?: number } {\n if (\n alibabaOptions?.enableThinking != null ||\n alibabaOptions?.thinkingBudget != null\n ) {\n return {\n ...(alibabaOptions.enableThinking != null\n ? { enable_thinking: alibabaOptions.enableThinking }\n : {}),\n ...(alibabaOptions.thinkingBudget != null\n ? { thinking_budget: alibabaOptions.thinkingBudget }\n : {}),\n };\n }\n\n if (!isCustomReasoning(reasoning)) {\n return {};\n }\n\n if (reasoning === 'none') {\n return { enable_thinking: false };\n }\n\n const thinkingBudget = mapReasoningToProviderBudget({\n reasoning,\n maxOutputTokens: 16384,\n maxReasoningBudget: 16384,\n warnings,\n });\n\n return {\n enable_thinking: true,\n ...(thinkingBudget != null ? { thinking_budget: thinkingBudget } : {}),\n };\n}\n\n/**\n * Reference for schemas below:\n * https://www.alibabacloud.com/help/en/model-studio/qwen-api-via-openai-chat-completions\n */\nconst alibabaUsageSchema = z.looseObject({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n prompt_tokens_details: z\n .looseObject({\n cached_tokens: z.number().nullish(),\n cache_creation_input_tokens: z.number().nullish(),\n cache_type: z.string().nullish(),\n })\n .nullish(),\n completion_tokens_details: z\n .looseObject({\n reasoning_tokens: z.number().nullish(),\n })\n .nullish(),\n});\n\nconst alibabaChatResponseSchema = z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.literal('assistant').nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(), // Alibaba thinking mode\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal('function'),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .nullish(),\n }),\n finish_reason: z.string().nullish(),\n index: z.number(),\n }),\n ),\n usage: alibabaUsageSchema.nullish(),\n});\n\nconst alibabaChatChunkSchema = z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n delta: z.object({\n role: z.enum(['assistant']).nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(), // Alibaba thinking mode delta\n tool_calls: z\n .array(\n z.object({\n index: z.number().nullish(), // Index for accumulating tool calls\n id: z.string().nullish(),\n type: z.literal('function').nullish(),\n function: z\n .object({\n name: z.string().nullish(),\n arguments: z.string().nullish(),\n })\n .nullish(),\n }),\n )\n .nullish(),\n }),\n finish_reason: z.string().nullish(),\n index: z.number(),\n }),\n ),\n usage: alibabaUsageSchema.nullish(), // Usage only appears in final chunk\n});\n","import { z } from 'zod/v4';\n\n// https://www.alibabacloud.com/help/en/model-studio/models\nexport type AlibabaChatModelId =\n // commercial edition - hybrid-thinking mode (disabled by default)\n | 'qwen3.7-max'\n | 'qwen3-max'\n | 'qwen3-max-preview'\n | 'qwen-plus'\n | 'qwen-plus-latest'\n | 'qwen-flash'\n | 'qwen-turbo'\n | 'qwen-turbo-latest'\n // open-source edition - hybrid-thinking mode (enabled by default)\n | 'qwen3-235b-a22b'\n | 'qwen3-32b'\n | 'qwen3-30b-a3b'\n | 'qwen3-14b'\n // thinking-only mode\n | 'qwen3-next-80b-a3b-thinking'\n | 'qwen3-235b-a22b-thinking-2507'\n | 'qwen3-30b-a3b-thinking-2507'\n | 'qwq-plus'\n | 'qwq-plus-latest'\n | 'qwq-32b'\n // code models\n | 'qwen-coder'\n | 'qwen3-coder-plus'\n | 'qwen3-coder-flash'\n | (string & {});\n\nexport const alibabaLanguageModelChatOptions = z.object({\n /**\n * Enable thinking/reasoning mode for supported models.\n * When enabled, the model generates reasoning content before the response.\n *\n * @default false\n */\n enableThinking: z.boolean().optional(),\n\n /**\n * Maximum number of reasoning tokens to generate.\n */\n thinkingBudget: z.number().positive().optional(),\n\n /**\n * Whether to enable parallel function calling during tool use.\n *\n * @default true\n */\n parallelToolCalls: z.boolean().optional(),\n});\n\nexport type AlibabaLanguageModelChatOptions = z.infer<\n typeof alibabaLanguageModelChatOptions\n>;\n","import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nconst alibabaErrorDataSchema = z.object({\n error: z.object({\n message: z.string(),\n code: z.string().nullish(),\n type: z.string().nullish(),\n }),\n});\n\nexport type AlibabaErrorData = z.infer<typeof alibabaErrorDataSchema>;\n\nexport const alibabaFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: alibabaErrorDataSchema,\n errorToMessage: data => data.error.message,\n});\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4CallOptions,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport type {\n AlibabaChatToolChoice,\n AlibabaFunctionTool,\n} from './alibaba-chat-prompt';\n\nexport function prepareTools({\n tools,\n toolChoice,\n}: {\n tools: LanguageModelV4CallOptions['tools'];\n toolChoice?: LanguageModelV4CallOptions['toolChoice'];\n}): {\n tools: undefined | Array<AlibabaFunctionTool>;\n toolChoice: AlibabaChatToolChoice | undefined;\n toolWarnings: SharedV4Warning[];\n} {\n // when the tools array is empty, change it to undefined to prevent errors:\n tools = tools?.length ? tools : undefined;\n\n const toolWarnings: SharedV4Warning[] = [];\n\n if (tools == null) {\n return { tools: undefined, toolChoice: undefined, toolWarnings };\n }\n\n const alibabaTools: Array<AlibabaFunctionTool> = [];\n\n for (const tool of tools) {\n if (tool.type === 'provider') {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n });\n } else {\n alibabaTools.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n ...(tool.strict != null ? { strict: tool.strict } : {}),\n },\n });\n }\n }\n\n if (toolChoice == null) {\n return { tools: alibabaTools, toolChoice: undefined, toolWarnings };\n }\n\n const type = toolChoice.type;\n\n switch (type) {\n case 'auto':\n case 'none':\n case 'required':\n return { tools: alibabaTools, toolChoice: type, toolWarnings };\n case 'tool':\n return {\n tools: alibabaTools,\n toolChoice: {\n type: 'function',\n function: { name: toolChoice.toolName },\n },\n toolWarnings,\n };\n default: {\n const _exhaustiveCheck: never = type;\n throw new UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`,\n });\n }\n }\n}\n","import type { LanguageModelV4Usage } from '@ai-sdk/provider';\nimport { createNullLanguageModelUsage } from '@ai-sdk/provider-utils';\n\n/**\n * Usage as reported by Alibaba's OpenAI-compatible chat completions API.\n *\n * The fields below are the ones this provider maps onto the standard usage\n * shape. Alibaba returns more than this, and `alibabaUsageSchema` parses\n * loosely so that anything undeclared survives into `raw` rather than being\n * dropped. Declared fields are therefore a subset of what a caller may find\n * there.\n */\nexport type AlibabaUsage = {\n prompt_tokens?: number | null;\n completion_tokens?: number | null;\n total_tokens?: number | null;\n prompt_tokens_details?: {\n cached_tokens?: number | null;\n cache_creation_input_tokens?: number | null;\n /**\n * Which caching mode served the request. Alibaba populates this only under\n * explicit context caching, which sending `cache_control` selects; under\n * implicit caching the field is absent. The two modes are mutually\n * exclusive and priced differently, so this is the discriminator for\n * attributing cache reads to a rate.\n */\n cache_type?: string | null;\n } | null;\n completion_tokens_details?: {\n reasoning_tokens?: number | null;\n } | null;\n};\n\nexport function convertAlibabaUsage(\n usage: AlibabaUsage | undefined | null,\n): LanguageModelV4Usage {\n if (usage == null) {\n return createNullLanguageModelUsage();\n }\n\n const promptTokens = usage.prompt_tokens ?? 0;\n const completionTokens = usage.completion_tokens ?? 0;\n const cacheReadTokens = usage.prompt_tokens_details?.cached_tokens ?? 0;\n const cacheWriteTokens =\n usage.prompt_tokens_details?.cache_creation_input_tokens ?? 0;\n const reasoningTokens =\n usage.completion_tokens_details?.reasoning_tokens ?? 0;\n\n return {\n inputTokens: {\n total: promptTokens,\n // Alibaba counts both cache reads and cache writes inside prompt_tokens.\n noCache: promptTokens - cacheReadTokens - cacheWriteTokens,\n cacheRead: cacheReadTokens,\n cacheWrite: cacheWriteTokens,\n },\n outputTokens: {\n total: completionTokens,\n text: completionTokens - reasoningTokens,\n reasoning: reasoningTokens,\n },\n raw: usage,\n };\n}\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4FilePart,\n type LanguageModelV4Prompt,\n} from '@ai-sdk/provider';\nimport {\n convertToBase64,\n getTopLevelMediaType,\n resolveFullMediaType,\n} from '@ai-sdk/provider-utils';\nimport type { AlibabaChatPrompt } from './alibaba-chat-prompt';\nimport type { CacheControlValidator } from './get-cache-control';\n\nfunction formatImageUrl({ part }: { part: LanguageModelV4FilePart }): string {\n if (part.data.type === 'url') {\n return part.data.url.toString();\n }\n\n if (part.data.type === 'data') {\n return `data:${resolveFullMediaType({ part })};base64,${convertToBase64(part.data.data)}`;\n }\n\n throw new UnsupportedFunctionalityError({\n functionality: `file part data type ${part.data.type}`,\n });\n}\n\nexport function convertToAlibabaChatMessages({\n prompt,\n cacheControlValidator,\n}: {\n prompt: LanguageModelV4Prompt;\n cacheControlValidator?: CacheControlValidator;\n}): AlibabaChatPrompt {\n const messages: AlibabaChatPrompt = [];\n\n for (const { role, content, ...message } of prompt) {\n const messageCacheControl = cacheControlValidator?.getCacheControl(\n message.providerOptions,\n );\n\n switch (role) {\n case 'system': {\n if (messageCacheControl) {\n messages.push({\n role: 'system',\n content: [\n {\n type: 'text',\n text: content,\n cache_control: messageCacheControl,\n },\n ],\n });\n } else {\n messages.push({ role: 'system', content });\n }\n break;\n }\n\n case 'user': {\n messages.push({\n role: 'user',\n content: content.map((part, index) => {\n const isLastPart = index === content.length - 1;\n const partCacheControl =\n cacheControlValidator?.getCacheControl(part.providerOptions) ??\n (isLastPart ? messageCacheControl : undefined);\n\n switch (part.type) {\n case 'text': {\n return {\n type: 'text',\n text: part.text,\n ...(partCacheControl\n ? { cache_control: partCacheControl }\n : {}),\n };\n }\n\n case 'file': {\n switch (part.data.type) {\n case 'reference': {\n throw new UnsupportedFunctionalityError({\n functionality: 'file parts with provider references',\n });\n }\n case 'text': {\n throw new UnsupportedFunctionalityError({\n functionality: 'text file parts',\n });\n }\n case 'url':\n case 'data': {\n if (getTopLevelMediaType(part.mediaType) === 'image') {\n return {\n type: 'image_url',\n image_url: {\n url: formatImageUrl({ part }),\n },\n ...(partCacheControl\n ? { cache_control: partCacheControl }\n : {}),\n };\n } else {\n throw new UnsupportedFunctionalityError({\n functionality: 'Only image file parts are supported',\n });\n }\n }\n }\n }\n }\n }),\n });\n break;\n }\n\n case 'assistant': {\n let text = '';\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }> = [];\n\n for (const part of content) {\n switch (part.type) {\n case 'text': {\n text += part.text;\n break;\n }\n case 'tool-call': {\n toolCalls.push({\n id: part.toolCallId,\n type: 'function',\n function: {\n name: part.toolName,\n arguments: JSON.stringify(part.input),\n },\n });\n break;\n }\n case 'reasoning': {\n // Alibaba ignores historical reasoning in multi-turn conversations.\n break;\n }\n }\n }\n\n if (text.length === 0 && toolCalls.length === 0) {\n break;\n }\n\n messages.push({\n role: 'assistant',\n content: messageCacheControl\n ? [{ type: 'text', text, cache_control: messageCacheControl }]\n : text || null,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n });\n\n break;\n }\n\n case 'tool': {\n const toolResponses = content.filter(\n r => r.type !== 'tool-approval-response',\n );\n\n for (let i = 0; i < toolResponses.length; i++) {\n const toolResponse = toolResponses[i];\n const output = toolResponse.output;\n const isLastPart = i === toolResponses.length - 1;\n\n const partCacheControl =\n cacheControlValidator?.getCacheControl(\n toolResponse.providerOptions,\n ) ?? (isLastPart ? messageCacheControl : undefined);\n\n let contentValue: string;\n switch (output.type) {\n case 'text':\n case 'error-text':\n contentValue = output.value;\n break;\n case 'execution-denied':\n contentValue = output.reason ?? 'Tool call execution denied.';\n break;\n case 'content':\n case 'json':\n case 'error-json':\n contentValue = JSON.stringify(output.value);\n break;\n }\n\n messages.push({\n role: 'tool',\n tool_call_id: toolResponse.toolCallId,\n content: partCacheControl\n ? [\n {\n type: 'text',\n text: contentValue,\n cache_control: partCacheControl,\n },\n ]\n : contentValue,\n });\n }\n break;\n }\n\n default: {\n const _exhaustiveCheck: never = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n\n return messages;\n}\n","import type {\n SharedV4ProviderMetadata,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport type { AlibabaCacheControl } from './alibaba-chat-prompt';\n\n// Alibaba allows a maximum of 4 cache breakpoints per request\nconst MAX_CACHE_BREAKPOINTS = 4;\n\nfunction getCacheControl(\n providerMetadata: SharedV4ProviderMetadata | undefined,\n): AlibabaCacheControl | undefined {\n const alibaba = providerMetadata?.alibaba;\n\n const cacheControlValue = alibaba?.cacheControl ?? alibaba?.cache_control;\n\n // Pass through value assuming it is of the correct type.\n // The Alibaba API will validate the value.\n return cacheControlValue as AlibabaCacheControl | undefined;\n}\n\nexport class CacheControlValidator {\n private breakpointCount = 0;\n private warnings: SharedV4Warning[] = [];\n\n getCacheControl(\n providerMetadata: SharedV4ProviderMetadata | undefined,\n ): AlibabaCacheControl | undefined {\n const cacheControlValue = getCacheControl(providerMetadata);\n\n if (!cacheControlValue) {\n return undefined;\n }\n\n this.breakpointCount++;\n if (this.breakpointCount > MAX_CACHE_BREAKPOINTS) {\n this.warnings.push({\n type: 'other',\n message: `Max breakpoint limit exceeded. Only the last ${MAX_CACHE_BREAKPOINTS} cache markers will take effect.`,\n });\n }\n\n return cacheControlValue;\n }\n\n getWarnings(): SharedV4Warning[] {\n return this.warnings;\n }\n}\n","import type { LanguageModelV4FinishReason } from '@ai-sdk/provider';\n\nexport function mapAlibabaFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV4FinishReason['unified'] {\n switch (finishReason) {\n case 'stop':\n return 'stop';\n case 'length':\n return 'length';\n case 'content_filter':\n return 'content-filter';\n case 'function_call':\n case 'tool_calls':\n return 'tool-calls';\n default:\n return 'other';\n }\n}\n","import {\n TooManyEmbeddingValuesForCallError,\n UnsupportedFunctionalityError,\n type EmbeddingModelV4,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n alibabaEmbeddingModelOptions,\n type AlibabaEmbeddingModelId,\n} from './alibaba-embedding-model-options';\nimport type { AlibabaConfig } from './alibaba-config';\n\n// TODO: Add Alibaba multimodal embedding support in a follow-up change.\nconst alibabaEmbeddingFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: z.object({\n code: z.string().nullish(),\n message: z.string(),\n request_id: z.string().nullish(),\n }),\n errorToMessage: data => data.message,\n});\n\nexport class AlibabaEmbeddingModel implements EmbeddingModelV4 {\n readonly specificationVersion = 'v4';\n readonly modelId: AlibabaEmbeddingModelId;\n readonly maxEmbeddingsPerCall = 10;\n readonly supportsParallelCalls = false;\n\n private readonly config: AlibabaConfig;\n\n static [WORKFLOW_SERIALIZE](model: AlibabaEmbeddingModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: AlibabaEmbeddingModelId;\n config: AlibabaConfig;\n }) {\n return new AlibabaEmbeddingModel(options.modelId, options.config);\n }\n\n constructor(modelId: AlibabaEmbeddingModelId, config: AlibabaConfig) {\n this.modelId = modelId;\n this.config = config;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n async doEmbed({\n values,\n headers,\n abortSignal,\n providerOptions,\n }: Parameters<EmbeddingModelV4['doEmbed']>[0]): Promise<\n Awaited<ReturnType<EmbeddingModelV4['doEmbed']>>\n > {\n if (values.length > this.maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n provider: this.provider,\n modelId: this.modelId,\n maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,\n values,\n });\n }\n\n const alibabaOptions = await parseProviderOptions({\n provider: 'alibaba',\n providerOptions,\n schema: alibabaEmbeddingModelOptions,\n });\n\n // TODO: Explore first-class sparse embedding support in AI SDK core.\n if (alibabaOptions?.outputType === 'sparse') {\n throw new UnsupportedFunctionalityError({\n functionality: \"Alibaba embedding outputType 'sparse'\",\n message:\n \"Alibaba embedding outputType 'sparse' is not supported because AI SDK embeddings require dense number arrays. Use 'dense' or 'dense&sparse' instead.\",\n });\n }\n\n const {\n responseHeaders,\n value: response,\n rawValue,\n } = await postJsonToApi({\n url: `${this.config.baseURL}/services/embeddings/text-embedding/text-embedding`,\n headers: combineHeaders(this.config.headers?.(), headers),\n body: {\n model: this.modelId,\n input: {\n texts: values,\n },\n parameters: {\n text_type: alibabaOptions?.textType,\n dimension: alibabaOptions?.dimension,\n output_type: alibabaOptions?.outputType,\n },\n },\n failedResponseHandler: alibabaEmbeddingFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n alibabaTextEmbeddingResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n const sortedEmbeddings = response.output.embeddings.sort(\n (a, b) => a.text_index - b.text_index,\n );\n const sparseEmbeddings = sortedEmbeddings\n .map(item =>\n item.sparse_embedding == null\n ? undefined\n : {\n textIndex: item.text_index,\n sparseEmbedding: item.sparse_embedding,\n },\n )\n .filter(item => item != null);\n\n return {\n warnings: [],\n embeddings: sortedEmbeddings.map(item => item.embedding),\n usage: response.usage\n ? { tokens: response.usage.total_tokens }\n : undefined,\n providerMetadata:\n sparseEmbeddings.length > 0\n ? {\n alibaba: {\n sparseEmbeddings,\n },\n }\n : undefined,\n response: { headers: responseHeaders, body: rawValue },\n };\n }\n}\n\nconst alibabaTextEmbeddingSparseEmbeddingSchema = z.object({\n index: z.number(),\n value: z.number(),\n token: z.string().nullish(),\n});\n\nconst alibabaTextEmbeddingResponseSchema = z.object({\n output: z.object({\n embeddings: z.array(\n z.object({\n embedding: z.array(z.number()),\n text_index: z.number(),\n sparse_embedding: z\n .array(alibabaTextEmbeddingSparseEmbeddingSchema)\n .nullish(),\n }),\n ),\n }),\n usage: z\n .object({\n total_tokens: z.number(),\n })\n .nullish(),\n});\n","import { z } from 'zod/v4';\n\nexport type AlibabaEmbeddingModelId =\n | 'text-embedding-v4'\n | 'text-embedding-v3'\n | (string & {});\n\nexport const alibabaEmbeddingModelOptions = z.object({\n /**\n * Differentiates query text from document text for asymmetric retrieval tasks.\n * Defaults to `document`.\n */\n textType: z.enum(['query', 'document']).optional(),\n\n /**\n * The dimension of the output embedding vectors. Defaults to 1024.\n *\n * `text-embedding-v4` also supports 1536 and 2048 dimensions.\n */\n dimension: z.number().optional(),\n\n /**\n * The output vector type. Defaults to `dense`.\n *\n * Sparse-only output is not supported by the AI SDK embedding interface,\n * which requires dense number arrays.\n */\n outputType: z.enum(['dense', 'sparse', 'dense&sparse']).optional(),\n});\n\nexport type AlibabaEmbeddingModelOptions = z.infer<\n typeof alibabaEmbeddingModelOptions\n>;\n","import {\n AISDKError,\n type Experimental_VideoModelV4 as VideoModelV4,\n type Experimental_VideoModelV4CallOptions as VideoModelV4CallOptions,\n type Experimental_VideoModelV4File as VideoModelV4File,\n type Experimental_VideoModelV4OperationStartResult as VideoModelV4OperationStartResult,\n type Experimental_VideoModelV4OperationStatusResult as VideoModelV4OperationStatusResult,\n type SharedV4ProviderMetadata,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n convertUint8ArrayToBase64,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n alibabaVideoModelOptionsSchema,\n type AlibabaVideoModelOptions,\n} from './alibaba-video-model-options';\nimport type { AlibabaVideoModelId } from './alibaba-video-settings';\n\ninterface AlibabaVideoModelConfig {\n provider: string;\n baseURL: string;\n headers: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\n// DashScope native API error format (different from OpenAI-compatible endpoint)\nconst alibabaVideoErrorSchema = z.object({\n code: z.string().nullish(),\n message: z.string(),\n request_id: z.string().nullish(),\n});\n\nconst alibabaVideoFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: alibabaVideoErrorSchema,\n errorToMessage: data => data.message,\n});\n\nconst alibabaVideoCreateTaskSchema = z.object({\n output: z\n .object({\n task_status: z.string(),\n task_id: z.string(),\n })\n .nullish(),\n request_id: z.string().nullish(),\n});\n\nconst alibabaVideoTaskStatusSchema = z.object({\n output: z\n .object({\n task_id: z.string(),\n task_status: z.string(),\n video_url: z.string().nullish(),\n submit_time: z.string().nullish(),\n scheduled_time: z.string().nullish(),\n end_time: z.string().nullish(),\n orig_prompt: z.string().nullish(),\n actual_prompt: z.string().nullish(),\n code: z.string().nullish(),\n message: z.string().nullish(),\n })\n .nullish(),\n usage: z\n .object({\n duration: z.number().nullish(),\n output_video_duration: z.number().nullish(),\n SR: z.number().nullish(),\n size: z.string().nullish(),\n })\n .nullish(),\n request_id: z.string().nullish(),\n});\n\ntype AlibabaVideoTaskStatusResponse = z.infer<\n typeof alibabaVideoTaskStatusSchema\n>;\n\nfunction detectMode(modelId: string): 't2v' | 'i2v' | 'r2v' {\n if (modelId.includes('-i2v')) return 'i2v';\n if (modelId.includes('-r2v')) return 'r2v';\n return 't2v';\n}\n\n// wan2.7 models use a different protocol than earlier wan models:\n// resolution tiers + ratio instead of size, input.media instead of\n// input.reference_urls (R2V), and no shot_type or audio parameters.\nfunction isWan27Model(modelId: string): boolean {\n return modelId.startsWith('wan2.7');\n}\n\n// Maps SDK \"WIDTHxHEIGHT\" resolutions to Alibaba resolution tiers.\nconst resolutionTierMap: Record<string, string> = {\n '1280x720': '720P',\n '720x1280': '720P',\n '960x960': '720P',\n '1088x832': '720P',\n '832x1088': '720P',\n '1920x1080': '1080P',\n '1080x1920': '1080P',\n '1440x1440': '1080P',\n '1632x1248': '1080P',\n '1248x1632': '1080P',\n '832x480': '480P',\n '480x832': '480P',\n '624x624': '480P',\n};\n\nconst supportedRatios = new Set(['16:9', '9:16', '1:1', '4:3', '3:4']);\n\nfunction deriveRatioFromResolution(\n resolution: `${number}x${number}`,\n): string | undefined {\n const [width, height] = resolution.split('x').map(Number);\n if (\n !Number.isInteger(width) ||\n !Number.isInteger(height) ||\n width <= 0 ||\n height <= 0\n ) {\n return undefined;\n }\n let a = width;\n let b = height;\n while (b !== 0) {\n [a, b] = [b, a % b];\n }\n const ratio = `${width / a}:${height / a}`;\n return supportedRatios.has(ratio) ? ratio : undefined;\n}\n\nfunction fileToImageString(file: VideoModelV4File): string {\n if (file.type === 'url') {\n return file.url;\n }\n return typeof file.data === 'string'\n ? file.data\n : convertUint8ArrayToBase64(file.data);\n}\n\nfunction getFirstFrameImage(\n options: VideoModelV4CallOptions,\n): VideoModelV4File | undefined {\n return options.frameImages?.find(frame => frame.frameType === 'first_frame')\n ?.image;\n}\n\nfunction resolveStartImage(\n options: VideoModelV4CallOptions,\n): VideoModelV4File | undefined {\n return getFirstFrameImage(options) ?? options.image;\n}\n\nfunction isVideoUrl(url: string): boolean {\n return /\\.(mp4|mov)([?#]|$)/i.test(url);\n}\n\n// Builds the wan2.7 input.media array from inputReferences and frameImages.\nfunction resolveMedia(\n options: VideoModelV4CallOptions,\n alibabaOptions: AlibabaVideoModelOptions | undefined,\n warnings: SharedV4Warning[],\n): Array<Record<string, unknown>> | undefined {\n if (alibabaOptions?.media != null && alibabaOptions.media.length > 0) {\n return alibabaOptions.media.map(item => ({\n type: item.type,\n url: item.url,\n ...(item.referenceVoice != null\n ? { reference_voice: item.referenceVoice }\n : {}),\n }));\n }\n\n const media: Array<Record<string, unknown>> = [];\n\n for (const reference of options.inputReferences ?? []) {\n if (reference.type === 'url') {\n media.push({\n type: isVideoUrl(reference.url) ? 'reference_video' : 'reference_image',\n url: reference.url,\n });\n } else if (reference.mediaType.startsWith('image/')) {\n media.push({\n type: 'reference_image',\n url: convertImageModelFileToDataUri(reference),\n });\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'Alibaba reference-to-video requires URL references for videos. ' +\n 'Non-URL video reference was skipped.',\n });\n }\n }\n\n const firstFrame = getFirstFrameImage(options);\n if (firstFrame != null) {\n media.push({\n type: 'first_frame',\n url: convertImageModelFileToDataUri(firstFrame),\n });\n }\n\n return media.length > 0 ? media : undefined;\n}\n\nfunction resolveReferenceUrls(\n options: VideoModelV4CallOptions,\n alibabaOptions: AlibabaVideoModelOptions | undefined,\n warnings: SharedV4Warning[],\n): string[] | undefined {\n if (options.frameImages != null && options.frameImages.length > 0) {\n return undefined;\n }\n\n if (options.inputReferences != null && options.inputReferences.length > 0) {\n const urls: string[] = [];\n\n for (const reference of options.inputReferences) {\n if (reference.type === 'url') {\n urls.push(reference.url);\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'Alibaba reference-to-video requires URL references. ' +\n 'Non-URL reference was skipped.',\n });\n }\n }\n\n return urls.length > 0 ? urls : undefined;\n }\n\n return alibabaOptions?.referenceUrls ?? undefined;\n}\n\nexport class AlibabaVideoModel implements VideoModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxVideosPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: AlibabaVideoModelId,\n private readonly config: AlibabaVideoModelConfig,\n ) {}\n\n private async buildRequest(\n options: Parameters<NonNullable<VideoModelV4['doStart']>>[0],\n ): Promise<{\n input: Record<string, unknown>;\n parameters: Record<string, unknown>;\n warnings: SharedV4Warning[];\n alibabaOptions: AlibabaVideoModelOptions | undefined;\n }> {\n const warnings: SharedV4Warning[] = [];\n const mode = detectMode(this.modelId);\n\n const alibabaOptions = (await parseProviderOptions({\n provider: 'alibaba',\n providerOptions: options.providerOptions,\n schema: alibabaVideoModelOptionsSchema,\n })) as AlibabaVideoModelOptions | undefined;\n\n // Build input object\n const input: Record<string, unknown> = {};\n\n if (options.prompt != null) {\n input.prompt = options.prompt;\n }\n\n if (alibabaOptions?.negativePrompt != null) {\n input.negative_prompt = alibabaOptions.negativePrompt;\n }\n\n if (alibabaOptions?.audioUrl != null) {\n input.audio_url = alibabaOptions.audioUrl;\n }\n\n const startImage = resolveStartImage(options);\n const wan27 = isWan27Model(this.modelId);\n // wan2.7 T2V and R2V take an explicit aspect ratio (I2V follows the input image)\n const supportsRatio = wan27 && mode !== 'i2v';\n\n // Handle image input for I2V mode\n if (mode === 'i2v' && startImage != null) {\n input.img_url = fileToImageString(startImage);\n }\n\n // Handle references for R2V mode\n if (mode === 'r2v') {\n if (wan27) {\n // wan2.7: input.media\n const media = resolveMedia(options, alibabaOptions, warnings);\n if (media != null) {\n input.media = media;\n }\n } else {\n // wan2.6: legacy protocol with input.reference_urls\n const referenceUrls = resolveReferenceUrls(\n options,\n alibabaOptions,\n warnings,\n );\n if (referenceUrls != null && referenceUrls.length > 0) {\n input.reference_urls = referenceUrls;\n }\n }\n }\n\n const lastFrame = options.frameImages?.find(\n frame => frame.frameType === 'last_frame',\n )?.image;\n\n if (lastFrame != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'This model does not support last_frame. ' +\n 'The last frame image was ignored.',\n });\n }\n\n if (\n options.inputReferences != null &&\n options.inputReferences.length > 0 &&\n mode !== 'r2v'\n ) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'Alibaba only supports inputReferences (reference-to-video) on ' +\n 'reference-to-video models. The reference images were ignored.',\n });\n }\n\n // Build parameters object\n const parameters: Record<string, unknown> = {};\n\n if (options.duration != null) {\n parameters.duration = options.duration;\n }\n\n if (options.seed != null) {\n parameters.seed = options.seed;\n }\n\n // Resolution / Size mapping\n if (options.resolution != null) {\n if (mode === 'i2v' || wan27) {\n // I2V and wan2.7 models use \"720P\" / \"1080P\" format\n const resolutionTier =\n resolutionTierMap[options.resolution] || options.resolution;\n if (wan27 && resolutionTier !== '720P' && resolutionTier !== '1080P') {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n 'wan2.7 models only support 720P and 1080P ' +\n `resolutions. The resolution \"${options.resolution}\" was ignored.`,\n });\n } else {\n parameters.resolution = resolutionTier;\n }\n } else {\n // wan2.6 T2V and R2V use \"WIDTH*HEIGHT\" format for the size parameter\n // Convert \"WIDTHxHEIGHT\" (SDK standard) to \"WIDTH*HEIGHT\" (Alibaba API)\n parameters.size = options.resolution.replace('x', '*');\n }\n }\n\n // wan2.7 T2V and R2V support an explicit aspect ratio parameter\n if (supportsRatio) {\n const ratio =\n alibabaOptions?.ratio ??\n options.aspectRatio ??\n (options.resolution != null\n ? deriveRatioFromResolution(options.resolution)\n : undefined);\n if (ratio != null) {\n parameters.ratio = ratio;\n }\n }\n\n // Provider-specific parameters\n if (alibabaOptions?.promptExtend != null) {\n parameters.prompt_extend = alibabaOptions.promptExtend;\n }\n if (alibabaOptions?.shotType != null) {\n if (wan27) {\n // wan2.7 removed shot_type; shot structure is described in the prompt\n warnings.push({\n type: 'unsupported',\n feature: 'shotType',\n details:\n 'wan2.7 models do not support the shotType option. ' +\n 'Describe the shot structure in the prompt instead.',\n });\n } else {\n parameters.shot_type = alibabaOptions.shotType;\n }\n }\n if (alibabaOptions?.watermark != null) {\n parameters.watermark = alibabaOptions.watermark;\n }\n const audio = options.generateAudio ?? alibabaOptions?.audio;\n if (audio != null) {\n if (wan27) {\n // wan2.7 does not have an audio parameter (audio is always generated)\n warnings.push({\n type: 'unsupported',\n feature: 'generateAudio',\n details:\n 'wan2.7 models always generate audio. ' +\n 'The audio option was ignored.',\n });\n } else {\n parameters.audio = audio;\n }\n }\n\n // Warn about unsupported standard options\n if (options.aspectRatio && !supportsRatio) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'Alibaba video models use explicit size/resolution dimensions. Use the resolution option or providerOptions.alibaba for size control.',\n });\n }\n if (options.fps) {\n warnings.push({\n type: 'unsupported',\n feature: 'fps',\n details: 'Alibaba video models do not support custom FPS.',\n });\n }\n if (options.n != null && options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'Alibaba video models only support generating 1 video per call.',\n });\n }\n\n return { input, parameters, warnings, alibabaOptions };\n }\n\n private buildCompletedResult(\n statusResponse: AlibabaVideoTaskStatusResponse,\n responseHeaders: Record<string, string> | undefined,\n warnings: SharedV4Warning[],\n currentDate: Date,\n ): {\n status: 'completed';\n videos: Array<{ type: 'url'; url: string; mediaType: string }>;\n warnings: SharedV4Warning[];\n providerMetadata: SharedV4ProviderMetadata;\n response: {\n timestamp: Date;\n modelId: string;\n headers: Record<string, string> | undefined;\n };\n } {\n const taskId = statusResponse.output?.task_id;\n const videoUrl = statusResponse.output?.video_url;\n\n if (!videoUrl) {\n throw new AISDKError({\n name: 'ALIBABA_VIDEO_GENERATION_ERROR',\n message: `No video URL in response. Task ID: ${taskId}`,\n });\n }\n\n return {\n status: 'completed',\n videos: [\n {\n type: 'url',\n url: videoUrl,\n mediaType: 'video/mp4',\n },\n ],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n alibaba: {\n taskId,\n videoUrl,\n ...(statusResponse.output?.actual_prompt\n ? { actualPrompt: statusResponse.output.actual_prompt }\n : {}),\n ...(statusResponse.usage\n ? {\n usage: {\n duration: statusResponse.usage.duration,\n outputVideoDuration:\n statusResponse.usage.output_video_duration,\n resolution: statusResponse.usage.SR,\n size: statusResponse.usage.size,\n },\n }\n : {}),\n },\n },\n };\n }\n\n async doStart(\n options: Parameters<NonNullable<VideoModelV4['doStart']>>[0],\n ): Promise<VideoModelV4OperationStartResult> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { input, parameters, warnings } = await this.buildRequest(options);\n\n const { value: createResponse, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}/api/v1/services/aigc/video-generation/video-synthesis`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n {\n 'X-DashScope-Async': 'enable',\n },\n ),\n body: {\n model: this.modelId,\n input,\n parameters,\n },\n successfulResponseHandler: createJsonResponseHandler(\n alibabaVideoCreateTaskSchema,\n ),\n failedResponseHandler: alibabaVideoFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const taskId = createResponse.output?.task_id;\n if (!taskId) {\n throw new AISDKError({\n name: 'ALIBABA_VIDEO_GENERATION_ERROR',\n message: `No task_id returned from Alibaba API. Response: ${JSON.stringify(createResponse)}`,\n });\n }\n\n return {\n operation: { taskId },\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n async doStatus(\n options: Parameters<NonNullable<VideoModelV4['doStatus']>>[0],\n ): Promise<VideoModelV4OperationStatusResult> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { taskId } = options.operation as { taskId: string };\n\n const { value: statusResponse, responseHeaders } = await getFromApi({\n url: `${this.config.baseURL}/api/v1/tasks/${taskId}`,\n validateUrl: false,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n alibabaVideoTaskStatusSchema,\n ),\n failedResponseHandler: alibabaVideoFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const taskStatus = statusResponse.output?.task_status;\n\n if (taskStatus === 'SUCCEEDED') {\n return this.buildCompletedResult(\n statusResponse,\n responseHeaders,\n [],\n currentDate,\n );\n }\n\n if (taskStatus === 'FAILED' || taskStatus === 'CANCELED') {\n return {\n status: 'error' as const,\n error:\n `Video generation ${taskStatus.toLowerCase()}. Task ID: ${taskId}. ${statusResponse.output?.message ?? ''}`.trim(),\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n return {\n status: 'pending',\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n}\n","import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type AlibabaVideoModelOptions = {\n /** Negative prompt to specify what to avoid (max 500 chars). */\n negativePrompt?: string | null;\n /** URL to audio file for audio-video sync (WAV/MP3, 3-30s, max 15MB). */\n audioUrl?: string | null;\n /** Enable prompt extension/rewriting for better generation. Defaults to true. */\n promptExtend?: boolean | null;\n /**\n * Shot type: 'single' for single-shot or 'multi' for multi-shot narrative\n * (wan2.6 and earlier; wan2.7 models describe shot structure in the prompt).\n */\n shotType?: 'single' | 'multi' | null;\n /** Whether to add watermark to generated video. Defaults to false. */\n watermark?: boolean | null;\n /**\n * Enable audio generation (for wan2.6 I2V/R2V models;\n * wan2.7 models always generate audio).\n */\n audio?: boolean | null;\n /**\n * Reference URLs for reference-to-video mode (wan2.6 models).\n * Array of URLs to images (0-5) and/or videos (0-3), max 5 total.\n * Use character identifiers (character1, character2) in prompts to reference them.\n */\n referenceUrls?: string[] | null;\n /**\n * Explicit media array for reference-to-video mode (wan2.7 models).\n * Overrides the automatic mapping from `inputReferences` and `frameImages`.\n * Use `Image 1`, `Video 1`, etc. in prompts to reference media items\n * (images and videos are counted separately, in array order).\n */\n media?: Array<{\n type: 'reference_image' | 'reference_video' | 'first_frame';\n /** Public URL, or a `data:{mime};base64,{data}` URI for images. */\n url: string;\n /** URL to an audio file used as voice reference for this media item. */\n referenceVoice?: string | null;\n }> | null;\n /**\n * Aspect ratio (wan2.7 text-to-video and reference-to-video models).\n */\n ratio?: '16:9' | '9:16' | '1:1' | '4:3' | '3:4' | null;\n /** Polling interval in milliseconds. Defaults to 5000 (5 seconds). */\n pollIntervalMs?: number | null;\n /** Maximum wait time in milliseconds for video generation. Defaults to 600000 (10 minutes). */\n pollTimeoutMs?: number | null;\n [key: string]: unknown;\n};\n\nexport const alibabaVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.looseObject({\n negativePrompt: z.string().nullish(),\n audioUrl: z.string().nullish(),\n promptExtend: z.boolean().nullish(),\n shotType: z.enum(['single', 'multi']).nullish(),\n watermark: z.boolean().nullish(),\n audio: z.boolean().nullish(),\n referenceUrls: z.array(z.string()).nullish(),\n media: z\n .array(\n z.object({\n type: z.enum(['reference_image', 'reference_video', 'first_frame']),\n url: z.string(),\n referenceVoice: z.string().nullish(),\n }),\n )\n .nullish(),\n ratio: z.enum(['16:9', '9:16', '1:1', '4:3', '3:4']).nullish(),\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n }),\n ),\n);\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","z","UnsupportedFunctionalityError","_a","alibaba","z","UnsupportedFunctionalityError","combineHeaders","createJsonErrorResponseHandler","createJsonResponseHandler","parseProviderOptions","postJsonToApi","serializeModelOptions","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","z","z","createJsonErrorResponseHandler","z","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","UnsupportedFunctionalityError","postJsonToApi","combineHeaders","createJsonResponseHandler","combineHeaders","createJsonErrorResponseHandler","createJsonResponseHandler","parseProviderOptions","postJsonToApi","z","z","z","createJsonErrorResponseHandler","parseProviderOptions","postJsonToApi","combineHeaders","createJsonResponseHandler","_a"]}
|
|
1
|
+
{"version":3,"sources":["../src/alibaba-provider.ts","../src/alibaba-chat-language-model.ts","../src/alibaba-chat-language-model-options.ts","../src/alibaba-error.ts","../src/alibaba-prepare-tools.ts","../src/convert-alibaba-usage.ts","../src/convert-to-alibaba-chat-messages.ts","../src/get-cache-control.ts","../src/map-alibaba-finish-reason.ts","../src/alibaba-embedding-model.ts","../src/alibaba-embedding-model-options.ts","../src/alibaba-video-model.ts","../src/alibaba-video-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type EmbeddingModelV4,\n type Experimental_VideoModelV4,\n type LanguageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { AlibabaChatLanguageModel } from './alibaba-chat-language-model';\nimport type { AlibabaChatModelId } from './alibaba-chat-language-model-options';\nimport { AlibabaEmbeddingModel } from './alibaba-embedding-model';\nimport type { AlibabaEmbeddingModelId } from './alibaba-embedding-model-options';\nimport { AlibabaVideoModel } from './alibaba-video-model';\nimport type { AlibabaVideoModelId } from './alibaba-video-settings';\nimport { VERSION } from './version';\n\nexport type { AlibabaErrorData } from './alibaba-error';\nexport { alibabaFailedResponseHandler } from './alibaba-error';\n\nexport interface AlibabaProvider extends ProviderV4 {\n (modelId: AlibabaChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text generation.\n */\n languageModel(modelId: AlibabaChatModelId): LanguageModelV4;\n\n /**\n * Creates a chat model for text generation.\n */\n chatModel(modelId: AlibabaChatModelId): LanguageModelV4;\n\n /**\n * Creates a model for text embeddings.\n */\n embedding(modelId: AlibabaEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * Creates a model for text embeddings.\n */\n embeddingModel(modelId: AlibabaEmbeddingModelId): EmbeddingModelV4;\n\n /**\n * Creates a model for video generation.\n */\n video(modelId: AlibabaVideoModelId): Experimental_VideoModelV4;\n\n /**\n * Creates a model for video generation.\n */\n videoModel(modelId: AlibabaVideoModelId): Experimental_VideoModelV4;\n}\n\nexport interface AlibabaProviderSettings {\n /**\n * Use a different URL prefix for API calls, e.g. to use proxy servers or regional endpoints.\n * The default prefix is `https://dashscope-intl.aliyuncs.com/compatible-mode/v1`.\n */\n baseURL?: string;\n\n /**\n * Use a different URL prefix for video generation API calls.\n * The video API uses the DashScope native endpoint (not the OpenAI-compatible endpoint).\n * The default prefix is `https://dashscope-intl.aliyuncs.com`.\n */\n videoBaseURL?: string;\n\n /**\n * Use a different URL prefix for embedding API calls.\n * The embedding API uses the DashScope native endpoint (not the OpenAI-compatible endpoint).\n * The default prefix is `https://dashscope-intl.aliyuncs.com/api/v1`.\n */\n embeddingBaseURL?: string;\n\n /**\n * API key that is being sent using the `Authorization` header.\n * It defaults to the `ALIBABA_API_KEY` environment variable.\n */\n apiKey?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * Include usage information in streaming responses.\n * When enabled, token usage will be included in the final chunk.\n *\n * @default true\n */\n includeUsage?: boolean;\n}\n\n/**\n * Create an Alibaba Cloud (Qwen) provider instance.\n */\nexport function createAlibaba(\n options: AlibabaProviderSettings = {},\n): AlibabaProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ??\n 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1';\n\n const videoBaseURL =\n withoutTrailingSlash(options.videoBaseURL) ??\n 'https://dashscope-intl.aliyuncs.com';\n\n const embeddingBaseURL =\n withoutTrailingSlash(options.embeddingBaseURL) ??\n 'https://dashscope-intl.aliyuncs.com/api/v1';\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'ALIBABA_API_KEY',\n description: 'Alibaba Cloud (DashScope)',\n })}`,\n ...options.headers,\n },\n `ai-sdk/alibaba/${VERSION}`,\n );\n\n const createLanguageModel = (modelId: AlibabaChatModelId) =>\n new AlibabaChatLanguageModel(modelId, {\n provider: 'alibaba.chat',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n includeUsage: options.includeUsage ?? true,\n });\n\n const createEmbeddingModel = (modelId: AlibabaEmbeddingModelId) =>\n new AlibabaEmbeddingModel(modelId, {\n provider: 'alibaba.embedding',\n baseURL: embeddingBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const createVideoModel = (modelId: AlibabaVideoModelId) =>\n new AlibabaVideoModel(modelId, {\n provider: 'alibaba.video',\n baseURL: videoBaseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = function (modelId: AlibabaChatModelId) {\n if (new.target) {\n throw new Error(\n 'The Alibaba model function cannot be called with the new keyword.',\n );\n }\n\n return createLanguageModel(modelId);\n };\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createLanguageModel;\n provider.chatModel = createLanguageModel;\n provider.embedding = createEmbeddingModel;\n provider.embeddingModel = createEmbeddingModel;\n provider.video = createVideoModel;\n provider.videoModel = createVideoModel;\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n\nexport const alibaba = createAlibaba();\n","import type {\n LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4Content,\n LanguageModelV4FinishReason,\n LanguageModelV4GenerateResult,\n LanguageModelV4StreamPart,\n LanguageModelV4StreamResult,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n createLanguageModelResponseMetadata as getResponseMetadata,\n generateId,\n isCustomReasoning,\n mapReasoningToProviderBudget,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n StreamingToolCallTracker,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type InferSchema,\n type ParseResult,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n alibabaLanguageModelChatOptions,\n type AlibabaChatModelId,\n} from './alibaba-chat-language-model-options';\nimport type { AlibabaConfig } from './alibaba-config';\nimport { alibabaFailedResponseHandler } from './alibaba-error';\nimport { prepareTools } from './alibaba-prepare-tools';\nimport { convertAlibabaUsage } from './convert-alibaba-usage';\nimport { convertToAlibabaChatMessages } from './convert-to-alibaba-chat-messages';\nimport { CacheControlValidator } from './get-cache-control';\nimport { mapAlibabaFinishReason } from './map-alibaba-finish-reason';\n\n/**\n * Alibaba language model implementation.\n *\n * Implements LanguageModelV4 interface for Alibaba Cloud's Qwen models.\n * Supports OpenAI-compatible chat completions API with Alibaba-specific features:\n * - Reasoning/thinking mode (enable_thinking, reasoning_content)\n * - Thinking budget control (thinking_budget)\n * - Prompt caching (cached_tokens tracking)\n */\nexport class AlibabaChatLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n readonly modelId: AlibabaChatModelId;\n\n private readonly config: AlibabaConfig;\n\n static [WORKFLOW_SERIALIZE](model: AlibabaChatLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: AlibabaChatModelId;\n config: AlibabaConfig;\n }) {\n return new AlibabaChatLanguageModel(options.modelId, options.config);\n }\n\n constructor(modelId: AlibabaChatModelId, config: AlibabaConfig) {\n this.modelId = modelId;\n this.config = config;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n readonly supportedUrls: Record<string, RegExp[]> = {\n 'image/*': [/^https?:\\/\\/.*$/],\n };\n\n /**\n * Builds request arguments for Alibaba API call.\n * Converts AI SDK options to Alibaba API format.\n */\n private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n responseFormat,\n seed,\n reasoning,\n providerOptions,\n tools,\n toolChoice,\n }: LanguageModelV4CallOptions) {\n const warnings: SharedV4Warning[] = [];\n\n const cacheControlValidator = new CacheControlValidator();\n\n const alibabaOptions = await parseProviderOptions({\n provider: 'alibaba',\n providerOptions,\n schema: alibabaLanguageModelChatOptions,\n });\n\n // Warn about unsupported features\n if (frequencyPenalty != null) {\n warnings.push({ type: 'unsupported', feature: 'frequencyPenalty' });\n }\n\n // Build base request arguments\n const baseArgs = {\n model: this.modelId,\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n top_k: topK,\n presence_penalty: presencePenalty,\n stop: stopSequences,\n seed,\n response_format:\n responseFormat?.type === 'json'\n ? responseFormat.schema != null\n ? {\n type: 'json_schema',\n json_schema: {\n schema: responseFormat.schema,\n name: responseFormat.name ?? 'response',\n description: responseFormat.description,\n },\n }\n : { type: 'json_object' }\n : undefined,\n\n ...resolveAlibabaThinking({\n reasoning,\n alibabaOptions,\n warnings,\n }),\n\n // Convert messages with cache control support\n messages: convertToAlibabaChatMessages({\n prompt,\n cacheControlValidator,\n }),\n };\n\n // Prepare tools\n const {\n tools: alibabaTools,\n toolChoice: alibabaToolChoice,\n toolWarnings,\n } = prepareTools({ tools, toolChoice });\n\n warnings.push(...cacheControlValidator.getWarnings());\n\n return {\n args: {\n ...baseArgs,\n tools: alibabaTools,\n tool_choice: alibabaToolChoice,\n ...(alibabaTools != null &&\n alibabaOptions?.parallelToolCalls !== undefined\n ? { parallel_tool_calls: alibabaOptions.parallelToolCalls }\n : {}),\n },\n warnings: [...warnings, ...toolWarnings],\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args, warnings } = await this.getArgs(options);\n\n const {\n responseHeaders,\n value: response,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body: args,\n failedResponseHandler: alibabaFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n alibabaChatResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = response.choices[0];\n const content: Array<LanguageModelV4Content> = [];\n\n // text content:\n const text = choice.message.content;\n if (text != null && text.length > 0) {\n content.push({ type: 'text', text });\n }\n\n // reasoning content (Alibaba uses 'reasoning_content' field):\n const reasoning = choice.message.reasoning_content;\n if (reasoning != null && reasoning.length > 0) {\n content.push({\n type: 'reasoning',\n text: reasoning,\n });\n }\n\n // tool calls:\n if (choice.message.tool_calls != null) {\n for (const toolCall of choice.message.tool_calls) {\n content.push({\n type: 'tool-call',\n toolCallId: toolCall.id || generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments!,\n });\n }\n }\n\n return {\n content,\n finishReason: {\n unified: mapAlibabaFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n },\n usage: convertAlibabaUsage(response.usage),\n request: { body: JSON.stringify(args) },\n response: {\n ...getResponseMetadata(response),\n headers: responseHeaders,\n body: rawResponse,\n },\n warnings,\n };\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const { args, warnings } = await this.getArgs(options);\n const body = {\n ...args,\n stream: true,\n stream_options: this.config.includeUsage\n ? { include_usage: true }\n : undefined,\n };\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body,\n failedResponseHandler: alibabaFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n alibabaChatChunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n // Track state across chunks\n let finishReason: LanguageModelV4FinishReason = {\n unified: 'other',\n raw: undefined,\n };\n let usage: z.infer<typeof alibabaUsageSchema> | undefined = undefined;\n\n let isFirstChunk = true;\n let activeText = false;\n let activeReasoningId: string | null = null;\n\n let toolCallTracker: StreamingToolCallTracker;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<z.infer<typeof alibabaChatChunkSchema>>,\n LanguageModelV4StreamPart\n >({\n start(controller) {\n toolCallTracker = new StreamingToolCallTracker(controller, {\n generateId,\n });\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n // Emit raw chunk if requested (before anything else)\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n // Handle parse errors\n if (!chunk.success) {\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n const value = chunk.value;\n\n // Emit response metadata on first chunk\n if (isFirstChunk) {\n isFirstChunk = false;\n controller.enqueue({\n type: 'response-metadata',\n ...getResponseMetadata(value),\n });\n }\n\n // Track usage (appears in final chunk)\n if (value.usage != null) {\n usage = value.usage;\n }\n\n // Skip processing if no choices (usage-only chunk)\n if (value.choices.length === 0) {\n return;\n }\n\n const choice = value.choices[0];\n const delta = choice.delta;\n\n // Handle reasoning content streaming (Alibaba thinking mode)\n if (\n delta.reasoning_content != null &&\n delta.reasoning_content.length > 0\n ) {\n if (activeReasoningId == null) {\n // End any active text before starting reasoning\n if (activeText) {\n controller.enqueue({ type: 'text-end', id: '0' });\n activeText = false;\n }\n\n activeReasoningId = generateId();\n controller.enqueue({\n type: 'reasoning-start',\n id: activeReasoningId,\n });\n }\n\n controller.enqueue({\n type: 'reasoning-delta',\n id: activeReasoningId,\n delta: delta.reasoning_content,\n });\n }\n\n // Handle text content streaming\n if (delta.content != null && delta.content.length > 0) {\n // End any active reasoning before starting text\n if (activeReasoningId != null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: activeReasoningId,\n });\n activeReasoningId = null;\n }\n\n if (!activeText) {\n controller.enqueue({ type: 'text-start', id: '0' });\n activeText = true;\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: '0',\n delta: delta.content,\n });\n }\n\n // Handle tool call streaming\n if (delta.tool_calls != null) {\n // End any active reasoning or text before tool calls\n if (activeReasoningId != null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: activeReasoningId,\n });\n activeReasoningId = null;\n }\n if (activeText) {\n controller.enqueue({ type: 'text-end', id: '0' });\n activeText = false;\n }\n\n for (const toolCallDelta of delta.tool_calls) {\n toolCallTracker.processDelta(toolCallDelta);\n }\n }\n\n // Track finish reason\n if (choice.finish_reason != null) {\n finishReason = {\n unified: mapAlibabaFinishReason(choice.finish_reason),\n raw: choice.finish_reason,\n };\n }\n },\n\n flush(controller) {\n if (activeReasoningId != null) {\n controller.enqueue({\n type: 'reasoning-end',\n id: activeReasoningId,\n });\n }\n\n if (activeText) {\n controller.enqueue({ type: 'text-end', id: '0' });\n }\n\n toolCallTracker.flush();\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertAlibabaUsage(usage),\n });\n },\n }),\n ),\n request: { body: JSON.stringify(body) },\n response: { headers: responseHeaders },\n };\n }\n}\n\nfunction resolveAlibabaThinking({\n reasoning,\n alibabaOptions,\n warnings,\n}: {\n reasoning: LanguageModelV4CallOptions['reasoning'];\n alibabaOptions:\n | InferSchema<typeof alibabaLanguageModelChatOptions>\n | undefined;\n warnings: SharedV4Warning[];\n}): { enable_thinking?: boolean; thinking_budget?: number } {\n if (\n alibabaOptions?.enableThinking != null ||\n alibabaOptions?.thinkingBudget != null\n ) {\n return {\n ...(alibabaOptions.enableThinking != null\n ? { enable_thinking: alibabaOptions.enableThinking }\n : {}),\n ...(alibabaOptions.thinkingBudget != null\n ? { thinking_budget: alibabaOptions.thinkingBudget }\n : {}),\n };\n }\n\n if (!isCustomReasoning(reasoning)) {\n return {};\n }\n\n if (reasoning === 'none') {\n return { enable_thinking: false };\n }\n\n const thinkingBudget = mapReasoningToProviderBudget({\n reasoning,\n maxOutputTokens: 16384,\n maxReasoningBudget: 16384,\n warnings,\n });\n\n return {\n enable_thinking: true,\n ...(thinkingBudget != null ? { thinking_budget: thinkingBudget } : {}),\n };\n}\n\n/**\n * Reference for schemas below:\n * https://www.alibabacloud.com/help/en/model-studio/qwen-api-via-openai-chat-completions\n */\nconst alibabaUsageSchema = z.looseObject({\n prompt_tokens: z.number(),\n completion_tokens: z.number(),\n total_tokens: z.number(),\n prompt_tokens_details: z\n .looseObject({\n cached_tokens: z.number().nullish(),\n cache_creation_input_tokens: z.number().nullish(),\n cache_type: z.string().nullish(),\n })\n .nullish(),\n completion_tokens_details: z\n .looseObject({\n reasoning_tokens: z.number().nullish(),\n })\n .nullish(),\n});\n\nconst alibabaChatResponseSchema = z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.literal('assistant').nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(), // Alibaba thinking mode\n tool_calls: z\n .array(\n z.object({\n id: z.string(),\n type: z.literal('function'),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .nullish(),\n }),\n finish_reason: z.string().nullish(),\n index: z.number(),\n }),\n ),\n usage: alibabaUsageSchema.nullish(),\n});\n\nconst alibabaChatChunkSchema = z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n delta: z.object({\n role: z.enum(['assistant']).nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(), // Alibaba thinking mode delta\n tool_calls: z\n .array(\n z.object({\n index: z.number().nullish(), // Index for accumulating tool calls\n id: z.string().nullish(),\n type: z.literal('function').nullish(),\n function: z\n .object({\n name: z.string().nullish(),\n arguments: z.string().nullish(),\n })\n .nullish(),\n }),\n )\n .nullish(),\n }),\n finish_reason: z.string().nullish(),\n index: z.number(),\n }),\n ),\n usage: alibabaUsageSchema.nullish(), // Usage only appears in final chunk\n});\n","import { z } from 'zod/v4';\n\n// https://www.alibabacloud.com/help/en/model-studio/models\nexport type AlibabaChatModelId =\n // commercial edition - hybrid-thinking mode (disabled by default)\n | 'qwen3.7-max'\n | 'qwen3-max'\n | 'qwen3-max-preview'\n | 'qwen-plus'\n | 'qwen-plus-latest'\n | 'qwen-flash'\n | 'qwen-turbo'\n | 'qwen-turbo-latest'\n // open-source edition - hybrid-thinking mode (enabled by default)\n | 'qwen3-235b-a22b'\n | 'qwen3-32b'\n | 'qwen3-30b-a3b'\n | 'qwen3-14b'\n // thinking-only mode\n | 'qwen3-next-80b-a3b-thinking'\n | 'qwen3-235b-a22b-thinking-2507'\n | 'qwen3-30b-a3b-thinking-2507'\n | 'qwq-plus'\n | 'qwq-plus-latest'\n | 'qwq-32b'\n // code models\n | 'qwen-coder'\n | 'qwen3-coder-plus'\n | 'qwen3-coder-flash'\n | (string & {});\n\nexport const alibabaLanguageModelChatOptions = z.object({\n /**\n * Enable thinking/reasoning mode for supported models.\n * When enabled, the model generates reasoning content before the response.\n *\n * @default false\n */\n enableThinking: z.boolean().optional(),\n\n /**\n * Maximum number of reasoning tokens to generate.\n */\n thinkingBudget: z.number().positive().optional(),\n\n /**\n * Whether to enable parallel function calling during tool use.\n *\n * @default true\n */\n parallelToolCalls: z.boolean().optional(),\n});\n\nexport type AlibabaLanguageModelChatOptions = z.infer<\n typeof alibabaLanguageModelChatOptions\n>;\n","import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nconst alibabaErrorDataSchema = z.object({\n error: z.object({\n message: z.string(),\n code: z.string().nullish(),\n type: z.string().nullish(),\n }),\n});\n\nexport type AlibabaErrorData = z.infer<typeof alibabaErrorDataSchema>;\n\nexport const alibabaFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: alibabaErrorDataSchema,\n errorToMessage: data => data.error.message,\n});\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4CallOptions,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport type {\n AlibabaChatToolChoice,\n AlibabaFunctionTool,\n} from './alibaba-chat-prompt';\n\nexport function prepareTools({\n tools,\n toolChoice,\n}: {\n tools: LanguageModelV4CallOptions['tools'];\n toolChoice?: LanguageModelV4CallOptions['toolChoice'];\n}): {\n tools: undefined | Array<AlibabaFunctionTool>;\n toolChoice: AlibabaChatToolChoice | undefined;\n toolWarnings: SharedV4Warning[];\n} {\n // when the tools array is empty, change it to undefined to prevent errors:\n tools = tools?.length ? tools : undefined;\n\n const toolWarnings: SharedV4Warning[] = [];\n\n if (tools == null) {\n return { tools: undefined, toolChoice: undefined, toolWarnings };\n }\n\n const alibabaTools: Array<AlibabaFunctionTool> = [];\n\n for (const tool of tools) {\n if (tool.type === 'provider') {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n });\n } else {\n alibabaTools.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n ...(tool.strict != null ? { strict: tool.strict } : {}),\n },\n });\n }\n }\n\n if (toolChoice == null) {\n return { tools: alibabaTools, toolChoice: undefined, toolWarnings };\n }\n\n const type = toolChoice.type;\n\n switch (type) {\n case 'auto':\n case 'none':\n case 'required':\n return { tools: alibabaTools, toolChoice: type, toolWarnings };\n case 'tool':\n return {\n tools: alibabaTools,\n toolChoice: {\n type: 'function',\n function: { name: toolChoice.toolName },\n },\n toolWarnings,\n };\n default: {\n const _exhaustiveCheck: never = type;\n throw new UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`,\n });\n }\n }\n}\n","import type { LanguageModelV4Usage } from '@ai-sdk/provider';\nimport { createNullLanguageModelUsage } from '@ai-sdk/provider-utils';\n\n/**\n * Usage as reported by Alibaba's OpenAI-compatible chat completions API.\n *\n * The fields below are the ones this provider maps onto the standard usage\n * shape. Alibaba returns more than this, and `alibabaUsageSchema` parses\n * loosely so that anything undeclared survives into `raw` rather than being\n * dropped. Declared fields are therefore a subset of what a caller may find\n * there.\n */\nexport type AlibabaUsage = {\n prompt_tokens?: number | null;\n completion_tokens?: number | null;\n total_tokens?: number | null;\n prompt_tokens_details?: {\n cached_tokens?: number | null;\n cache_creation_input_tokens?: number | null;\n /**\n * Which caching mode served the request. Alibaba populates this only under\n * explicit context caching, which sending `cache_control` selects; under\n * implicit caching the field is absent. The two modes are mutually\n * exclusive and priced differently, so this is the discriminator for\n * attributing cache reads to a rate.\n */\n cache_type?: string | null;\n } | null;\n completion_tokens_details?: {\n reasoning_tokens?: number | null;\n } | null;\n};\n\nexport function convertAlibabaUsage(\n usage: AlibabaUsage | undefined | null,\n): LanguageModelV4Usage {\n if (usage == null) {\n return createNullLanguageModelUsage();\n }\n\n const promptTokens = usage.prompt_tokens ?? 0;\n const completionTokens = usage.completion_tokens ?? 0;\n const cacheReadTokens = usage.prompt_tokens_details?.cached_tokens ?? 0;\n const cacheWriteTokens =\n usage.prompt_tokens_details?.cache_creation_input_tokens ?? 0;\n const reasoningTokens =\n usage.completion_tokens_details?.reasoning_tokens ?? 0;\n\n return {\n inputTokens: {\n total: promptTokens,\n // Alibaba counts both cache reads and cache writes inside prompt_tokens.\n noCache: promptTokens - cacheReadTokens - cacheWriteTokens,\n cacheRead: cacheReadTokens,\n cacheWrite: cacheWriteTokens,\n },\n outputTokens: {\n total: completionTokens,\n text: Math.max(0, completionTokens - reasoningTokens),\n reasoning: reasoningTokens,\n },\n raw: usage,\n };\n}\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4FilePart,\n type LanguageModelV4Prompt,\n} from '@ai-sdk/provider';\nimport {\n convertToBase64,\n getTopLevelMediaType,\n resolveFullMediaType,\n} from '@ai-sdk/provider-utils';\nimport type { AlibabaChatPrompt } from './alibaba-chat-prompt';\nimport type { CacheControlValidator } from './get-cache-control';\n\nfunction formatImageUrl({ part }: { part: LanguageModelV4FilePart }): string {\n if (part.data.type === 'url') {\n return part.data.url.toString();\n }\n\n if (part.data.type === 'data') {\n return `data:${resolveFullMediaType({ part })};base64,${convertToBase64(part.data.data)}`;\n }\n\n throw new UnsupportedFunctionalityError({\n functionality: `file part data type ${part.data.type}`,\n });\n}\n\nexport function convertToAlibabaChatMessages({\n prompt,\n cacheControlValidator,\n}: {\n prompt: LanguageModelV4Prompt;\n cacheControlValidator?: CacheControlValidator;\n}): AlibabaChatPrompt {\n const messages: AlibabaChatPrompt = [];\n\n for (const { role, content, ...message } of prompt) {\n const messageCacheControl = cacheControlValidator?.getCacheControl(\n message.providerOptions,\n );\n\n switch (role) {\n case 'system': {\n if (messageCacheControl) {\n messages.push({\n role: 'system',\n content: [\n {\n type: 'text',\n text: content,\n cache_control: messageCacheControl,\n },\n ],\n });\n } else {\n messages.push({ role: 'system', content });\n }\n break;\n }\n\n case 'user': {\n messages.push({\n role: 'user',\n content: content.map((part, index) => {\n const isLastPart = index === content.length - 1;\n const partCacheControl =\n cacheControlValidator?.getCacheControl(part.providerOptions) ??\n (isLastPart ? messageCacheControl : undefined);\n\n switch (part.type) {\n case 'text': {\n return {\n type: 'text',\n text: part.text,\n ...(partCacheControl\n ? { cache_control: partCacheControl }\n : {}),\n };\n }\n\n case 'file': {\n switch (part.data.type) {\n case 'reference': {\n throw new UnsupportedFunctionalityError({\n functionality: 'file parts with provider references',\n });\n }\n case 'text': {\n throw new UnsupportedFunctionalityError({\n functionality: 'text file parts',\n });\n }\n case 'url':\n case 'data': {\n if (getTopLevelMediaType(part.mediaType) === 'image') {\n return {\n type: 'image_url',\n image_url: {\n url: formatImageUrl({ part }),\n },\n ...(partCacheControl\n ? { cache_control: partCacheControl }\n : {}),\n };\n } else {\n throw new UnsupportedFunctionalityError({\n functionality: 'Only image file parts are supported',\n });\n }\n }\n }\n }\n }\n }),\n });\n break;\n }\n\n case 'assistant': {\n let text = '';\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }> = [];\n\n for (const part of content) {\n switch (part.type) {\n case 'text': {\n text += part.text;\n break;\n }\n case 'tool-call': {\n toolCalls.push({\n id: part.toolCallId,\n type: 'function',\n function: {\n name: part.toolName,\n arguments: JSON.stringify(part.input),\n },\n });\n break;\n }\n case 'reasoning': {\n // Alibaba ignores historical reasoning in multi-turn conversations.\n break;\n }\n }\n }\n\n if (text.length === 0 && toolCalls.length === 0) {\n break;\n }\n\n messages.push({\n role: 'assistant',\n content: messageCacheControl\n ? [{ type: 'text', text, cache_control: messageCacheControl }]\n : text || null,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n });\n\n break;\n }\n\n case 'tool': {\n const toolResponses = content.filter(\n r => r.type !== 'tool-approval-response',\n );\n\n for (let i = 0; i < toolResponses.length; i++) {\n const toolResponse = toolResponses[i];\n const output = toolResponse.output;\n const isLastPart = i === toolResponses.length - 1;\n\n const partCacheControl =\n cacheControlValidator?.getCacheControl(\n toolResponse.providerOptions,\n ) ?? (isLastPart ? messageCacheControl : undefined);\n\n let contentValue: string;\n switch (output.type) {\n case 'text':\n case 'error-text':\n contentValue = output.value;\n break;\n case 'execution-denied':\n contentValue = output.reason ?? 'Tool call execution denied.';\n break;\n case 'content':\n case 'json':\n case 'error-json':\n contentValue = JSON.stringify(output.value);\n break;\n }\n\n messages.push({\n role: 'tool',\n tool_call_id: toolResponse.toolCallId,\n content: partCacheControl\n ? [\n {\n type: 'text',\n text: contentValue,\n cache_control: partCacheControl,\n },\n ]\n : contentValue,\n });\n }\n break;\n }\n\n default: {\n const _exhaustiveCheck: never = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n\n return messages;\n}\n","import type {\n SharedV4ProviderMetadata,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport type { AlibabaCacheControl } from './alibaba-chat-prompt';\n\n// Alibaba allows a maximum of 4 cache breakpoints per request\nconst MAX_CACHE_BREAKPOINTS = 4;\n\nfunction getCacheControl(\n providerMetadata: SharedV4ProviderMetadata | undefined,\n): AlibabaCacheControl | undefined {\n const alibaba = providerMetadata?.alibaba;\n\n const cacheControlValue = alibaba?.cacheControl ?? alibaba?.cache_control;\n\n // Pass through value assuming it is of the correct type.\n // The Alibaba API will validate the value.\n return cacheControlValue as AlibabaCacheControl | undefined;\n}\n\nexport class CacheControlValidator {\n private breakpointCount = 0;\n private warnings: SharedV4Warning[] = [];\n\n getCacheControl(\n providerMetadata: SharedV4ProviderMetadata | undefined,\n ): AlibabaCacheControl | undefined {\n const cacheControlValue = getCacheControl(providerMetadata);\n\n if (!cacheControlValue) {\n return undefined;\n }\n\n this.breakpointCount++;\n if (this.breakpointCount > MAX_CACHE_BREAKPOINTS) {\n this.warnings.push({\n type: 'other',\n message: `Max breakpoint limit exceeded. Only the last ${MAX_CACHE_BREAKPOINTS} cache markers will take effect.`,\n });\n }\n\n return cacheControlValue;\n }\n\n getWarnings(): SharedV4Warning[] {\n return this.warnings;\n }\n}\n","import type { LanguageModelV4FinishReason } from '@ai-sdk/provider';\n\nexport function mapAlibabaFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV4FinishReason['unified'] {\n switch (finishReason) {\n case 'stop':\n return 'stop';\n case 'length':\n return 'length';\n case 'content_filter':\n return 'content-filter';\n case 'function_call':\n case 'tool_calls':\n return 'tool-calls';\n default:\n return 'other';\n }\n}\n","import {\n TooManyEmbeddingValuesForCallError,\n UnsupportedFunctionalityError,\n type EmbeddingModelV4,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n alibabaEmbeddingModelOptions,\n type AlibabaEmbeddingModelId,\n} from './alibaba-embedding-model-options';\nimport type { AlibabaConfig } from './alibaba-config';\n\n// TODO: Add Alibaba multimodal embedding support in a follow-up change.\nconst alibabaEmbeddingFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: z.object({\n code: z.string().nullish(),\n message: z.string(),\n request_id: z.string().nullish(),\n }),\n errorToMessage: data => data.message,\n});\n\nexport class AlibabaEmbeddingModel implements EmbeddingModelV4 {\n readonly specificationVersion = 'v4';\n readonly modelId: AlibabaEmbeddingModelId;\n readonly maxEmbeddingsPerCall = 10;\n readonly supportsParallelCalls = false;\n\n private readonly config: AlibabaConfig;\n\n static [WORKFLOW_SERIALIZE](model: AlibabaEmbeddingModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: AlibabaEmbeddingModelId;\n config: AlibabaConfig;\n }) {\n return new AlibabaEmbeddingModel(options.modelId, options.config);\n }\n\n constructor(modelId: AlibabaEmbeddingModelId, config: AlibabaConfig) {\n this.modelId = modelId;\n this.config = config;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n async doEmbed({\n values,\n headers,\n abortSignal,\n providerOptions,\n }: Parameters<EmbeddingModelV4['doEmbed']>[0]): Promise<\n Awaited<ReturnType<EmbeddingModelV4['doEmbed']>>\n > {\n if (values.length > this.maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n provider: this.provider,\n modelId: this.modelId,\n maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,\n values,\n });\n }\n\n const alibabaOptions = await parseProviderOptions({\n provider: 'alibaba',\n providerOptions,\n schema: alibabaEmbeddingModelOptions,\n });\n\n // TODO: Explore first-class sparse embedding support in AI SDK core.\n if (alibabaOptions?.outputType === 'sparse') {\n throw new UnsupportedFunctionalityError({\n functionality: \"Alibaba embedding outputType 'sparse'\",\n message:\n \"Alibaba embedding outputType 'sparse' is not supported because AI SDK embeddings require dense number arrays. Use 'dense' or 'dense&sparse' instead.\",\n });\n }\n\n const {\n responseHeaders,\n value: response,\n rawValue,\n } = await postJsonToApi({\n url: `${this.config.baseURL}/services/embeddings/text-embedding/text-embedding`,\n headers: combineHeaders(this.config.headers?.(), headers),\n body: {\n model: this.modelId,\n input: {\n texts: values,\n },\n parameters: {\n text_type: alibabaOptions?.textType,\n dimension: alibabaOptions?.dimension,\n output_type: alibabaOptions?.outputType,\n },\n },\n failedResponseHandler: alibabaEmbeddingFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n alibabaTextEmbeddingResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n const sortedEmbeddings = response.output.embeddings.sort(\n (a, b) => a.text_index - b.text_index,\n );\n const sparseEmbeddings = sortedEmbeddings\n .map(item =>\n item.sparse_embedding == null\n ? undefined\n : {\n textIndex: item.text_index,\n sparseEmbedding: item.sparse_embedding,\n },\n )\n .filter(item => item != null);\n\n return {\n warnings: [],\n embeddings: sortedEmbeddings.map(item => item.embedding),\n usage: response.usage\n ? { tokens: response.usage.total_tokens }\n : undefined,\n providerMetadata:\n sparseEmbeddings.length > 0\n ? {\n alibaba: {\n sparseEmbeddings,\n },\n }\n : undefined,\n response: { headers: responseHeaders, body: rawValue },\n };\n }\n}\n\nconst alibabaTextEmbeddingSparseEmbeddingSchema = z.object({\n index: z.number(),\n value: z.number(),\n token: z.string().nullish(),\n});\n\nconst alibabaTextEmbeddingResponseSchema = z.object({\n output: z.object({\n embeddings: z.array(\n z.object({\n embedding: z.array(z.number()),\n text_index: z.number(),\n sparse_embedding: z\n .array(alibabaTextEmbeddingSparseEmbeddingSchema)\n .nullish(),\n }),\n ),\n }),\n usage: z\n .object({\n total_tokens: z.number(),\n })\n .nullish(),\n});\n","import { z } from 'zod/v4';\n\nexport type AlibabaEmbeddingModelId =\n | 'text-embedding-v4'\n | 'text-embedding-v3'\n | (string & {});\n\nexport const alibabaEmbeddingModelOptions = z.object({\n /**\n * Differentiates query text from document text for asymmetric retrieval tasks.\n * Defaults to `document`.\n */\n textType: z.enum(['query', 'document']).optional(),\n\n /**\n * The dimension of the output embedding vectors. Defaults to 1024.\n *\n * `text-embedding-v4` also supports 1536 and 2048 dimensions.\n */\n dimension: z.number().optional(),\n\n /**\n * The output vector type. Defaults to `dense`.\n *\n * Sparse-only output is not supported by the AI SDK embedding interface,\n * which requires dense number arrays.\n */\n outputType: z.enum(['dense', 'sparse', 'dense&sparse']).optional(),\n});\n\nexport type AlibabaEmbeddingModelOptions = z.infer<\n typeof alibabaEmbeddingModelOptions\n>;\n","import {\n AISDKError,\n type Experimental_VideoModelV4 as VideoModelV4,\n type Experimental_VideoModelV4CallOptions as VideoModelV4CallOptions,\n type Experimental_VideoModelV4File as VideoModelV4File,\n type Experimental_VideoModelV4OperationStartResult as VideoModelV4OperationStartResult,\n type Experimental_VideoModelV4OperationStatusResult as VideoModelV4OperationStatusResult,\n type SharedV4ProviderMetadata,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertImageModelFileToDataUri,\n convertUint8ArrayToBase64,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n getFromApi,\n parseProviderOptions,\n postJsonToApi,\n resolve,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n alibabaVideoModelOptionsSchema,\n type AlibabaVideoModelOptions,\n} from './alibaba-video-model-options';\nimport type { AlibabaVideoModelId } from './alibaba-video-settings';\n\ninterface AlibabaVideoModelConfig {\n provider: string;\n baseURL: string;\n headers: Resolvable<Record<string, string | undefined>>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\n// DashScope native API error format (different from OpenAI-compatible endpoint)\nconst alibabaVideoErrorSchema = z.object({\n code: z.string().nullish(),\n message: z.string(),\n request_id: z.string().nullish(),\n});\n\nconst alibabaVideoFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: alibabaVideoErrorSchema,\n errorToMessage: data => data.message,\n});\n\nconst alibabaVideoCreateTaskSchema = z.object({\n output: z\n .object({\n task_status: z.string(),\n task_id: z.string(),\n })\n .nullish(),\n request_id: z.string().nullish(),\n});\n\nconst alibabaVideoTaskStatusSchema = z.object({\n output: z\n .object({\n task_id: z.string(),\n task_status: z.string(),\n video_url: z.string().nullish(),\n submit_time: z.string().nullish(),\n scheduled_time: z.string().nullish(),\n end_time: z.string().nullish(),\n orig_prompt: z.string().nullish(),\n actual_prompt: z.string().nullish(),\n code: z.string().nullish(),\n message: z.string().nullish(),\n })\n .nullish(),\n usage: z\n .object({\n duration: z.number().nullish(),\n output_video_duration: z.number().nullish(),\n // wan3 splits the total: input video counts toward its 30s ceiling.\n input_video_duration: z.number().nullish(),\n fps: z.number().nullish(),\n SR: z.number().nullish(),\n size: z.string().nullish(),\n ratio: z.string().nullish(),\n })\n .nullish(),\n request_id: z.string().nullish(),\n});\n\ntype AlibabaVideoTaskStatusResponse = z.infer<\n typeof alibabaVideoTaskStatusSchema\n>;\n\n// Only meaningful for ids that name their mode (wan2.6/wan2.7). wan3 ships a\n// single all-in-one id, so its mode comes from the media the request carries.\nfunction detectMode(modelId: string): 't2v' | 'i2v' | 'r2v' {\n if (modelId.includes('-i2v')) return 'i2v';\n if (modelId.includes('-r2v')) return 'r2v';\n return 't2v';\n}\n\n/**\n * Request protocol, selected by model id:\n * - `legacy` (wan2.6 and earlier): `parameters.size`, `input.img_url`, and\n * `input.reference_urls`.\n * - `wan27`: resolution tiers and `ratio` instead of `size`, `input.media`\n * instead of `input.reference_urls`, no `shot_type`, audio always on.\n * - `wan3`: like `wan27`, plus a real `last_frame` slot, an `audio` toggle,\n * a 480P tier, and one id covering every mode.\n */\ntype AlibabaVideoProtocol = 'legacy' | 'wan27' | 'wan3';\n\nfunction detectProtocol(modelId: string): AlibabaVideoProtocol {\n if (modelId.startsWith('wan3')) return 'wan3';\n if (modelId.startsWith('wan2.7')) return 'wan27';\n return 'legacy';\n}\n\n// Maps SDK \"WIDTHxHEIGHT\" resolutions to Alibaba resolution tiers.\nconst resolutionTierMap: Record<string, string> = {\n '1280x720': '720P',\n '720x1280': '720P',\n '960x960': '720P',\n '1088x832': '720P',\n '832x1088': '720P',\n '1920x1080': '1080P',\n '1080x1920': '1080P',\n '1440x1440': '1080P',\n '1632x1248': '1080P',\n '1248x1632': '1080P',\n '832x480': '480P',\n '480x832': '480P',\n '624x624': '480P',\n};\n\nconst supportedRatios = new Set(['16:9', '9:16', '1:1', '4:3', '3:4']);\n\nfunction deriveRatioFromResolution(\n resolution: `${number}x${number}`,\n): string | undefined {\n const [width, height] = resolution.split('x').map(Number);\n if (\n !Number.isInteger(width) ||\n !Number.isInteger(height) ||\n width <= 0 ||\n height <= 0\n ) {\n return undefined;\n }\n let a = width;\n let b = height;\n while (b !== 0) {\n [a, b] = [b, a % b];\n }\n const ratio = `${width / a}:${height / a}`;\n return supportedRatios.has(ratio) ? ratio : undefined;\n}\n\nfunction fileToImageString(file: VideoModelV4File): string {\n if (file.type === 'url') {\n return file.url;\n }\n return typeof file.data === 'string'\n ? file.data\n : convertUint8ArrayToBase64(file.data);\n}\n\nfunction getFirstFrameImage(\n options: VideoModelV4CallOptions,\n): VideoModelV4File | undefined {\n return options.frameImages?.find(frame => frame.frameType === 'first_frame')\n ?.image;\n}\n\nfunction getLastFrameImage(\n options: VideoModelV4CallOptions,\n): VideoModelV4File | undefined {\n return options.frameImages?.find(frame => frame.frameType === 'last_frame')\n ?.image;\n}\n\nfunction resolveStartImage(\n options: VideoModelV4CallOptions,\n): VideoModelV4File | undefined {\n return getFirstFrameImage(options) ?? options.image;\n}\n\nfunction isVideoUrl(url: string): boolean {\n return /\\.(mp4|mov)([?#]|$)/i.test(url);\n}\n\n// Builds the input.media array (wan2.7 and wan3) from inputReferences plus the\n// frame images the caller resolved for this protocol.\nfunction resolveMedia(\n options: VideoModelV4CallOptions,\n alibabaOptions: AlibabaVideoModelOptions | undefined,\n warnings: SharedV4Warning[],\n frames: { first?: VideoModelV4File; last?: VideoModelV4File },\n): Array<Record<string, unknown>> | undefined {\n if (alibabaOptions?.media != null && alibabaOptions.media.length > 0) {\n return alibabaOptions.media.map(item => ({\n type: item.type,\n url: item.url,\n ...(item.referenceVoice != null\n ? { reference_voice: item.referenceVoice }\n : {}),\n }));\n }\n\n const media: Array<Record<string, unknown>> = [];\n\n for (const reference of options.inputReferences ?? []) {\n if (reference.type === 'url') {\n media.push({\n type: isVideoUrl(reference.url) ? 'reference_video' : 'reference_image',\n url: reference.url,\n });\n } else if (reference.mediaType.startsWith('image/')) {\n media.push({\n type: 'reference_image',\n url: convertImageModelFileToDataUri(reference),\n });\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'Alibaba reference-to-video requires URL references for videos. ' +\n 'Non-URL video reference was skipped.',\n });\n }\n }\n\n if (frames.first != null) {\n media.push({\n type: 'first_frame',\n url: convertImageModelFileToDataUri(frames.first),\n });\n }\n\n if (frames.last != null) {\n media.push({\n type: 'last_frame',\n url: convertImageModelFileToDataUri(frames.last),\n });\n }\n\n return media.length > 0 ? media : undefined;\n}\n\nfunction resolveReferenceUrls(\n options: VideoModelV4CallOptions,\n alibabaOptions: AlibabaVideoModelOptions | undefined,\n warnings: SharedV4Warning[],\n): string[] | undefined {\n if (options.frameImages != null && options.frameImages.length > 0) {\n return undefined;\n }\n\n if (options.inputReferences != null && options.inputReferences.length > 0) {\n const urls: string[] = [];\n\n for (const reference of options.inputReferences) {\n if (reference.type === 'url') {\n urls.push(reference.url);\n } else {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'Alibaba reference-to-video requires URL references. ' +\n 'Non-URL reference was skipped.',\n });\n }\n }\n\n return urls.length > 0 ? urls : undefined;\n }\n\n return alibabaOptions?.referenceUrls ?? undefined;\n}\n\nexport class AlibabaVideoModel implements VideoModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxVideosPerCall = 1;\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: AlibabaVideoModelId,\n private readonly config: AlibabaVideoModelConfig,\n ) {}\n\n private async buildRequest(\n options: Parameters<NonNullable<VideoModelV4['doStart']>>[0],\n ): Promise<{\n input: Record<string, unknown>;\n parameters: Record<string, unknown>;\n warnings: SharedV4Warning[];\n alibabaOptions: AlibabaVideoModelOptions | undefined;\n }> {\n const warnings: SharedV4Warning[] = [];\n const mode = detectMode(this.modelId);\n\n const alibabaOptions = (await parseProviderOptions({\n provider: 'alibaba',\n providerOptions: options.providerOptions,\n schema: alibabaVideoModelOptionsSchema,\n })) as AlibabaVideoModelOptions | undefined;\n\n // Build input object\n const input: Record<string, unknown> = {};\n\n if (options.prompt != null) {\n input.prompt = options.prompt;\n }\n\n if (alibabaOptions?.negativePrompt != null) {\n input.negative_prompt = alibabaOptions.negativePrompt;\n }\n\n if (alibabaOptions?.audioUrl != null) {\n input.audio_url = alibabaOptions.audioUrl;\n }\n\n const startImage = resolveStartImage(options);\n const protocol = detectProtocol(this.modelId);\n const wan27 = protocol === 'wan27';\n const wan3 = protocol === 'wan3';\n // Resolution tiers and input.media replaced size/img_url from wan2.7 on.\n const tieredProtocol = wan27 || wan3;\n // wan2.7 T2V and R2V take an explicit aspect ratio (I2V follows the input\n // image); wan3 serves every mode from one id, so it always takes one.\n const supportsRatio = wan3 || (wan27 && mode !== 'i2v');\n\n // Handle image input for I2V mode (wan3 carries frames in input.media)\n if (!wan3 && mode === 'i2v' && startImage != null) {\n input.img_url = fileToImageString(startImage);\n }\n\n if (wan3) {\n // The media the request carries decides whether this is text-, image-,\n // or reference-to-video, so there is no mode to read off the id. A bare\n // prompt stays text-to-video.\n const media = resolveMedia(options, alibabaOptions, warnings, {\n first: startImage,\n last: getLastFrameImage(options),\n });\n if (media != null) {\n input.media = media;\n }\n } else if (mode === 'r2v') {\n if (wan27) {\n // wan2.7: input.media\n const media = resolveMedia(options, alibabaOptions, warnings, {\n first: getFirstFrameImage(options),\n });\n if (media != null) {\n input.media = media;\n }\n } else {\n // wan2.6: legacy protocol with input.reference_urls\n const referenceUrls = resolveReferenceUrls(\n options,\n alibabaOptions,\n warnings,\n );\n if (referenceUrls != null && referenceUrls.length > 0) {\n input.reference_urls = referenceUrls;\n }\n }\n }\n\n const lastFrame = getLastFrameImage(options);\n\n // wan3 has a real closing-frame slot, filled in input.media above.\n if (lastFrame != null && !wan3) {\n warnings.push({\n type: 'unsupported',\n feature: 'frameImages',\n details:\n 'This model does not support last_frame. ' +\n 'The last frame image was ignored.',\n });\n }\n\n if (\n options.inputReferences != null &&\n options.inputReferences.length > 0 &&\n mode !== 'r2v' &&\n !wan3\n ) {\n warnings.push({\n type: 'unsupported',\n feature: 'inputReferences',\n details:\n 'Alibaba only supports inputReferences (reference-to-video) on ' +\n 'reference-to-video models. The reference images were ignored.',\n });\n }\n\n // Build parameters object\n const parameters: Record<string, unknown> = {};\n\n if (options.duration != null) {\n parameters.duration = options.duration;\n }\n\n if (options.seed != null) {\n parameters.seed = options.seed;\n }\n\n // Resolution / Size mapping\n if (options.resolution != null) {\n if (mode === 'i2v' || tieredProtocol) {\n // I2V, wan2.7, and wan3 use the \"720P\" / \"1080P\" tier format\n const resolutionTier =\n resolutionTierMap[options.resolution] || options.resolution;\n // wan3 adds a 480P tier to wan2.7's two.\n const supportedTiers = wan3\n ? ['480P', '720P', '1080P']\n : ['720P', '1080P'];\n if (tieredProtocol && !supportedTiers.includes(resolutionTier)) {\n warnings.push({\n type: 'unsupported',\n feature: 'resolution',\n details:\n `${wan3 ? 'wan3' : 'wan2.7'} models only support the ` +\n `${supportedTiers.join(', ')} resolution tiers. ` +\n `The resolution \"${options.resolution}\" was ignored.`,\n });\n } else {\n parameters.resolution = resolutionTier;\n }\n } else {\n // wan2.6 T2V and R2V use \"WIDTH*HEIGHT\" format for the size parameter\n // Convert \"WIDTHxHEIGHT\" (SDK standard) to \"WIDTH*HEIGHT\" (Alibaba API)\n parameters.size = options.resolution.replace('x', '*');\n }\n }\n\n // wan2.7 T2V and R2V support an explicit aspect ratio parameter\n if (supportsRatio) {\n const ratio =\n alibabaOptions?.ratio ??\n options.aspectRatio ??\n (options.resolution != null\n ? deriveRatioFromResolution(options.resolution)\n : undefined);\n if (ratio != null) {\n parameters.ratio = ratio;\n }\n }\n\n // Provider-specific parameters\n if (alibabaOptions?.promptExtend != null) {\n parameters.prompt_extend = alibabaOptions.promptExtend;\n }\n if (alibabaOptions?.shotType != null) {\n if (tieredProtocol) {\n // wan2.7 removed shot_type; shot structure is described in the prompt\n warnings.push({\n type: 'unsupported',\n feature: 'shotType',\n details:\n `${wan3 ? 'wan3' : 'wan2.7'} models do not support the shotType ` +\n 'option. Describe the shot structure in the prompt instead.',\n });\n } else {\n parameters.shot_type = alibabaOptions.shotType;\n }\n }\n if (alibabaOptions?.watermark != null) {\n parameters.watermark = alibabaOptions.watermark;\n }\n const audio = options.generateAudio ?? alibabaOptions?.audio;\n if (audio != null) {\n if (wan27) {\n // wan2.7 does not have an audio parameter (audio is always generated)\n warnings.push({\n type: 'unsupported',\n feature: 'generateAudio',\n details:\n 'wan2.7 models always generate audio. ' +\n 'The audio option was ignored.',\n });\n } else {\n parameters.audio = audio;\n }\n }\n\n // Warn about unsupported standard options\n if (options.aspectRatio && !supportsRatio) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'Alibaba video models use explicit size/resolution dimensions. Use the resolution option or providerOptions.alibaba for size control.',\n });\n }\n if (options.fps) {\n warnings.push({\n type: 'unsupported',\n feature: 'fps',\n details: 'Alibaba video models do not support custom FPS.',\n });\n }\n if (options.n != null && options.n > 1) {\n warnings.push({\n type: 'unsupported',\n feature: 'n',\n details:\n 'Alibaba video models only support generating 1 video per call.',\n });\n }\n\n return { input, parameters, warnings, alibabaOptions };\n }\n\n private buildCompletedResult(\n statusResponse: AlibabaVideoTaskStatusResponse,\n responseHeaders: Record<string, string> | undefined,\n warnings: SharedV4Warning[],\n currentDate: Date,\n ): {\n status: 'completed';\n videos: Array<{ type: 'url'; url: string; mediaType: string }>;\n warnings: SharedV4Warning[];\n providerMetadata: SharedV4ProviderMetadata;\n response: {\n timestamp: Date;\n modelId: string;\n headers: Record<string, string> | undefined;\n };\n } {\n const taskId = statusResponse.output?.task_id;\n const videoUrl = statusResponse.output?.video_url;\n\n if (!videoUrl) {\n throw new AISDKError({\n name: 'ALIBABA_VIDEO_GENERATION_ERROR',\n message: `No video URL in response. Task ID: ${taskId}`,\n });\n }\n\n return {\n status: 'completed',\n videos: [\n {\n type: 'url',\n url: videoUrl,\n mediaType: 'video/mp4',\n },\n ],\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n providerMetadata: {\n alibaba: {\n taskId,\n videoUrl,\n ...(statusResponse.output?.actual_prompt\n ? { actualPrompt: statusResponse.output.actual_prompt }\n : {}),\n ...(statusResponse.usage\n ? {\n usage: {\n duration: statusResponse.usage.duration,\n outputVideoDuration:\n statusResponse.usage.output_video_duration,\n resolution: statusResponse.usage.SR,\n size: statusResponse.usage.size,\n // wan3-only. Spread rather than set to undefined so the\n // metadata shape for older wan models is unchanged.\n ...(statusResponse.usage.input_video_duration != null\n ? {\n inputVideoDuration:\n statusResponse.usage.input_video_duration,\n }\n : {}),\n ...(statusResponse.usage.fps != null\n ? { fps: statusResponse.usage.fps }\n : {}),\n ...(statusResponse.usage.ratio != null\n ? { ratio: statusResponse.usage.ratio }\n : {}),\n },\n }\n : {}),\n },\n },\n };\n }\n\n async doStart(\n options: Parameters<NonNullable<VideoModelV4['doStart']>>[0],\n ): Promise<VideoModelV4OperationStartResult> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { input, parameters, warnings } = await this.buildRequest(options);\n\n const { value: createResponse, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}/api/v1/services/aigc/video-generation/video-synthesis`,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n {\n 'X-DashScope-Async': 'enable',\n },\n ),\n body: {\n model: this.modelId,\n input,\n parameters,\n },\n successfulResponseHandler: createJsonResponseHandler(\n alibabaVideoCreateTaskSchema,\n ),\n failedResponseHandler: alibabaVideoFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const taskId = createResponse.output?.task_id;\n if (!taskId) {\n throw new AISDKError({\n name: 'ALIBABA_VIDEO_GENERATION_ERROR',\n message: `No task_id returned from Alibaba API. Response: ${JSON.stringify(createResponse)}`,\n });\n }\n\n return {\n operation: { taskId },\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n async doStatus(\n options: Parameters<NonNullable<VideoModelV4['doStatus']>>[0],\n ): Promise<VideoModelV4OperationStatusResult> {\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { taskId } = options.operation as { taskId: string };\n\n const { value: statusResponse, responseHeaders } = await getFromApi({\n url: `${this.config.baseURL}/api/v1/tasks/${taskId}`,\n validateUrl: false,\n headers: combineHeaders(\n await resolve(this.config.headers),\n options.headers,\n ),\n successfulResponseHandler: createJsonResponseHandler(\n alibabaVideoTaskStatusSchema,\n ),\n failedResponseHandler: alibabaVideoFailedResponseHandler,\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const taskStatus = statusResponse.output?.task_status;\n\n if (taskStatus === 'SUCCEEDED') {\n return this.buildCompletedResult(\n statusResponse,\n responseHeaders,\n [],\n currentDate,\n );\n }\n\n if (taskStatus === 'FAILED' || taskStatus === 'CANCELED') {\n return {\n status: 'error' as const,\n error:\n `Video generation ${taskStatus.toLowerCase()}. Task ID: ${taskId}. ${statusResponse.output?.message ?? ''}`.trim(),\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n\n return {\n status: 'pending',\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n}\n","import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type AlibabaVideoModelOptions = {\n /** Negative prompt to specify what to avoid (max 500 chars). */\n negativePrompt?: string | null;\n /** URL to audio file for audio-video sync (WAV/MP3, 3-30s, max 15MB). */\n audioUrl?: string | null;\n /** Enable prompt extension/rewriting for better generation. Defaults to true. */\n promptExtend?: boolean | null;\n /**\n * Shot type: 'single' for single-shot or 'multi' for multi-shot narrative\n * (wan2.6 and earlier; wan2.7 models describe shot structure in the prompt).\n */\n shotType?: 'single' | 'multi' | null;\n /** Whether to add watermark to generated video. Defaults to false. */\n watermark?: boolean | null;\n /**\n * Enable audio generation (wan2.6 I2V/R2V and wan3 models;\n * wan2.7 models always generate audio). Defaults to true on wan3.\n */\n audio?: boolean | null;\n /**\n * Reference URLs for reference-to-video mode (wan2.6 models).\n * Array of URLs to images (0-5) and/or videos (0-3), max 5 total.\n * Use character identifiers (character1, character2) in prompts to reference them.\n */\n referenceUrls?: string[] | null;\n /**\n * Explicit media array (wan2.7 and wan3 models). Overrides the automatic\n * mapping from `inputReferences` and `frameImages`.\n * Use `Image 1`, `Video 1`, etc. in prompts to reference media items\n * (images, videos, and audio are counted separately, in array order).\n *\n * `reference_audio`, `file`, and `link` are wan3-only and have no top-level\n * call option, so they can only be passed here. wan3 also rejects mixing\n * `reference_*`/`file`/`link` with `first_frame`/`last_frame`.\n */\n media?: Array<{\n type:\n | 'reference_image'\n | 'reference_video'\n | 'reference_audio'\n | 'first_frame'\n | 'last_frame'\n | 'file'\n | 'link';\n /** Public URL, or a `data:{mime};base64,{data}` URI for images. */\n url: string;\n /** URL to an audio file used as voice reference for this media item. */\n referenceVoice?: string | null;\n }> | null;\n /**\n * Aspect ratio (wan2.7 text-to-video and reference-to-video models, and\n * every wan3 generation). `adaptive` is wan3-only, and is its default.\n */\n ratio?: 'adaptive' | '16:9' | '9:16' | '1:1' | '4:3' | '3:4' | null;\n /** Polling interval in milliseconds. Defaults to 5000 (5 seconds). */\n pollIntervalMs?: number | null;\n /** Maximum wait time in milliseconds for video generation. Defaults to 600000 (10 minutes). */\n pollTimeoutMs?: number | null;\n [key: string]: unknown;\n};\n\nexport const alibabaVideoModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.looseObject({\n negativePrompt: z.string().nullish(),\n audioUrl: z.string().nullish(),\n promptExtend: z.boolean().nullish(),\n shotType: z.enum(['single', 'multi']).nullish(),\n watermark: z.boolean().nullish(),\n audio: z.boolean().nullish(),\n referenceUrls: z.array(z.string()).nullish(),\n media: z\n .array(\n z.object({\n type: z.enum([\n 'reference_image',\n 'reference_video',\n 'reference_audio',\n 'first_frame',\n 'last_frame',\n 'file',\n 'link',\n ]),\n url: z.string(),\n referenceVoice: z.string().nullish(),\n }),\n )\n .nullish(),\n ratio: z\n .enum(['adaptive', '16:9', '9:16', '1:1', '4:3', '3:4'])\n .nullish(),\n pollIntervalMs: z.number().positive().nullish(),\n pollTimeoutMs: z.number().positive().nullish(),\n }),\n ),\n);\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","z","UnsupportedFunctionalityError","_a","alibaba","z","UnsupportedFunctionalityError","combineHeaders","createJsonErrorResponseHandler","createJsonResponseHandler","parseProviderOptions","postJsonToApi","serializeModelOptions","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","z","z","createJsonErrorResponseHandler","z","WORKFLOW_SERIALIZE","serializeModelOptions","WORKFLOW_DESERIALIZE","parseProviderOptions","UnsupportedFunctionalityError","postJsonToApi","combineHeaders","createJsonResponseHandler","combineHeaders","createJsonErrorResponseHandler","createJsonResponseHandler","parseProviderOptions","postJsonToApi","z","z","z","createJsonErrorResponseHandler","parseProviderOptions","postJsonToApi","combineHeaders","createJsonResponseHandler","_a"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/alibaba",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.35",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -25,16 +25,16 @@
|
|
|
25
25
|
}
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@ai-sdk/provider": "4.0.
|
|
29
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
28
|
+
"@ai-sdk/provider": "4.0.8",
|
|
29
|
+
"@ai-sdk/provider-utils": "5.0.30"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
+
"@ai-sdk/test-server": "2.0.1",
|
|
32
33
|
"@types/node": "22.19.19",
|
|
34
|
+
"@vercel/ai-tsconfig": "0.0.0",
|
|
33
35
|
"tsup": "^8.5.1",
|
|
34
36
|
"typescript": "5.8.3",
|
|
35
|
-
"zod": "3.25.76"
|
|
36
|
-
"@ai-sdk/test-server": "2.0.1",
|
|
37
|
-
"@vercel/ai-tsconfig": "0.0.0"
|
|
37
|
+
"zod": "3.25.76"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"zod": "^3.25.76 || ^4.1.8"
|
|
@@ -16,8 +16,8 @@ export type AlibabaVideoModelOptions = {
|
|
|
16
16
|
/** Whether to add watermark to generated video. Defaults to false. */
|
|
17
17
|
watermark?: boolean | null;
|
|
18
18
|
/**
|
|
19
|
-
* Enable audio generation (
|
|
20
|
-
* wan2.7 models always generate audio).
|
|
19
|
+
* Enable audio generation (wan2.6 I2V/R2V and wan3 models;
|
|
20
|
+
* wan2.7 models always generate audio). Defaults to true on wan3.
|
|
21
21
|
*/
|
|
22
22
|
audio?: boolean | null;
|
|
23
23
|
/**
|
|
@@ -27,22 +27,34 @@ export type AlibabaVideoModelOptions = {
|
|
|
27
27
|
*/
|
|
28
28
|
referenceUrls?: string[] | null;
|
|
29
29
|
/**
|
|
30
|
-
* Explicit media array
|
|
31
|
-
*
|
|
30
|
+
* Explicit media array (wan2.7 and wan3 models). Overrides the automatic
|
|
31
|
+
* mapping from `inputReferences` and `frameImages`.
|
|
32
32
|
* Use `Image 1`, `Video 1`, etc. in prompts to reference media items
|
|
33
|
-
* (images and
|
|
33
|
+
* (images, videos, and audio are counted separately, in array order).
|
|
34
|
+
*
|
|
35
|
+
* `reference_audio`, `file`, and `link` are wan3-only and have no top-level
|
|
36
|
+
* call option, so they can only be passed here. wan3 also rejects mixing
|
|
37
|
+
* `reference_*`/`file`/`link` with `first_frame`/`last_frame`.
|
|
34
38
|
*/
|
|
35
39
|
media?: Array<{
|
|
36
|
-
type:
|
|
40
|
+
type:
|
|
41
|
+
| 'reference_image'
|
|
42
|
+
| 'reference_video'
|
|
43
|
+
| 'reference_audio'
|
|
44
|
+
| 'first_frame'
|
|
45
|
+
| 'last_frame'
|
|
46
|
+
| 'file'
|
|
47
|
+
| 'link';
|
|
37
48
|
/** Public URL, or a `data:{mime};base64,{data}` URI for images. */
|
|
38
49
|
url: string;
|
|
39
50
|
/** URL to an audio file used as voice reference for this media item. */
|
|
40
51
|
referenceVoice?: string | null;
|
|
41
52
|
}> | null;
|
|
42
53
|
/**
|
|
43
|
-
* Aspect ratio (wan2.7 text-to-video and reference-to-video models
|
|
54
|
+
* Aspect ratio (wan2.7 text-to-video and reference-to-video models, and
|
|
55
|
+
* every wan3 generation). `adaptive` is wan3-only, and is its default.
|
|
44
56
|
*/
|
|
45
|
-
ratio?: '16:9' | '9:16' | '1:1' | '4:3' | '3:4' | null;
|
|
57
|
+
ratio?: 'adaptive' | '16:9' | '9:16' | '1:1' | '4:3' | '3:4' | null;
|
|
46
58
|
/** Polling interval in milliseconds. Defaults to 5000 (5 seconds). */
|
|
47
59
|
pollIntervalMs?: number | null;
|
|
48
60
|
/** Maximum wait time in milliseconds for video generation. Defaults to 600000 (10 minutes). */
|
|
@@ -63,13 +75,23 @@ export const alibabaVideoModelOptionsSchema = lazySchema(() =>
|
|
|
63
75
|
media: z
|
|
64
76
|
.array(
|
|
65
77
|
z.object({
|
|
66
|
-
type: z.enum([
|
|
78
|
+
type: z.enum([
|
|
79
|
+
'reference_image',
|
|
80
|
+
'reference_video',
|
|
81
|
+
'reference_audio',
|
|
82
|
+
'first_frame',
|
|
83
|
+
'last_frame',
|
|
84
|
+
'file',
|
|
85
|
+
'link',
|
|
86
|
+
]),
|
|
67
87
|
url: z.string(),
|
|
68
88
|
referenceVoice: z.string().nullish(),
|
|
69
89
|
}),
|
|
70
90
|
)
|
|
71
91
|
.nullish(),
|
|
72
|
-
ratio: z
|
|
92
|
+
ratio: z
|
|
93
|
+
.enum(['adaptive', '16:9', '9:16', '1:1', '4:3', '3:4'])
|
|
94
|
+
.nullish(),
|
|
73
95
|
pollIntervalMs: z.number().positive().nullish(),
|
|
74
96
|
pollTimeoutMs: z.number().positive().nullish(),
|
|
75
97
|
}),
|
|
@@ -79,8 +79,12 @@ const alibabaVideoTaskStatusSchema = z.object({
|
|
|
79
79
|
.object({
|
|
80
80
|
duration: z.number().nullish(),
|
|
81
81
|
output_video_duration: z.number().nullish(),
|
|
82
|
+
// wan3 splits the total: input video counts toward its 30s ceiling.
|
|
83
|
+
input_video_duration: z.number().nullish(),
|
|
84
|
+
fps: z.number().nullish(),
|
|
82
85
|
SR: z.number().nullish(),
|
|
83
86
|
size: z.string().nullish(),
|
|
87
|
+
ratio: z.string().nullish(),
|
|
84
88
|
})
|
|
85
89
|
.nullish(),
|
|
86
90
|
request_id: z.string().nullish(),
|
|
@@ -90,17 +94,29 @@ type AlibabaVideoTaskStatusResponse = z.infer<
|
|
|
90
94
|
typeof alibabaVideoTaskStatusSchema
|
|
91
95
|
>;
|
|
92
96
|
|
|
97
|
+
// Only meaningful for ids that name their mode (wan2.6/wan2.7). wan3 ships a
|
|
98
|
+
// single all-in-one id, so its mode comes from the media the request carries.
|
|
93
99
|
function detectMode(modelId: string): 't2v' | 'i2v' | 'r2v' {
|
|
94
100
|
if (modelId.includes('-i2v')) return 'i2v';
|
|
95
101
|
if (modelId.includes('-r2v')) return 'r2v';
|
|
96
102
|
return 't2v';
|
|
97
103
|
}
|
|
98
104
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
105
|
+
/**
|
|
106
|
+
* Request protocol, selected by model id:
|
|
107
|
+
* - `legacy` (wan2.6 and earlier): `parameters.size`, `input.img_url`, and
|
|
108
|
+
* `input.reference_urls`.
|
|
109
|
+
* - `wan27`: resolution tiers and `ratio` instead of `size`, `input.media`
|
|
110
|
+
* instead of `input.reference_urls`, no `shot_type`, audio always on.
|
|
111
|
+
* - `wan3`: like `wan27`, plus a real `last_frame` slot, an `audio` toggle,
|
|
112
|
+
* a 480P tier, and one id covering every mode.
|
|
113
|
+
*/
|
|
114
|
+
type AlibabaVideoProtocol = 'legacy' | 'wan27' | 'wan3';
|
|
115
|
+
|
|
116
|
+
function detectProtocol(modelId: string): AlibabaVideoProtocol {
|
|
117
|
+
if (modelId.startsWith('wan3')) return 'wan3';
|
|
118
|
+
if (modelId.startsWith('wan2.7')) return 'wan27';
|
|
119
|
+
return 'legacy';
|
|
104
120
|
}
|
|
105
121
|
|
|
106
122
|
// Maps SDK "WIDTHxHEIGHT" resolutions to Alibaba resolution tiers.
|
|
@@ -159,6 +175,13 @@ function getFirstFrameImage(
|
|
|
159
175
|
?.image;
|
|
160
176
|
}
|
|
161
177
|
|
|
178
|
+
function getLastFrameImage(
|
|
179
|
+
options: VideoModelV4CallOptions,
|
|
180
|
+
): VideoModelV4File | undefined {
|
|
181
|
+
return options.frameImages?.find(frame => frame.frameType === 'last_frame')
|
|
182
|
+
?.image;
|
|
183
|
+
}
|
|
184
|
+
|
|
162
185
|
function resolveStartImage(
|
|
163
186
|
options: VideoModelV4CallOptions,
|
|
164
187
|
): VideoModelV4File | undefined {
|
|
@@ -169,11 +192,13 @@ function isVideoUrl(url: string): boolean {
|
|
|
169
192
|
return /\.(mp4|mov)([?#]|$)/i.test(url);
|
|
170
193
|
}
|
|
171
194
|
|
|
172
|
-
// Builds the
|
|
195
|
+
// Builds the input.media array (wan2.7 and wan3) from inputReferences plus the
|
|
196
|
+
// frame images the caller resolved for this protocol.
|
|
173
197
|
function resolveMedia(
|
|
174
198
|
options: VideoModelV4CallOptions,
|
|
175
199
|
alibabaOptions: AlibabaVideoModelOptions | undefined,
|
|
176
200
|
warnings: SharedV4Warning[],
|
|
201
|
+
frames: { first?: VideoModelV4File; last?: VideoModelV4File },
|
|
177
202
|
): Array<Record<string, unknown>> | undefined {
|
|
178
203
|
if (alibabaOptions?.media != null && alibabaOptions.media.length > 0) {
|
|
179
204
|
return alibabaOptions.media.map(item => ({
|
|
@@ -209,11 +234,17 @@ function resolveMedia(
|
|
|
209
234
|
}
|
|
210
235
|
}
|
|
211
236
|
|
|
212
|
-
|
|
213
|
-
if (firstFrame != null) {
|
|
237
|
+
if (frames.first != null) {
|
|
214
238
|
media.push({
|
|
215
239
|
type: 'first_frame',
|
|
216
|
-
url: convertImageModelFileToDataUri(
|
|
240
|
+
url: convertImageModelFileToDataUri(frames.first),
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (frames.last != null) {
|
|
245
|
+
media.push({
|
|
246
|
+
type: 'last_frame',
|
|
247
|
+
url: convertImageModelFileToDataUri(frames.last),
|
|
217
248
|
});
|
|
218
249
|
}
|
|
219
250
|
|
|
@@ -298,20 +329,37 @@ export class AlibabaVideoModel implements VideoModelV4 {
|
|
|
298
329
|
}
|
|
299
330
|
|
|
300
331
|
const startImage = resolveStartImage(options);
|
|
301
|
-
const
|
|
302
|
-
|
|
303
|
-
const
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
332
|
+
const protocol = detectProtocol(this.modelId);
|
|
333
|
+
const wan27 = protocol === 'wan27';
|
|
334
|
+
const wan3 = protocol === 'wan3';
|
|
335
|
+
// Resolution tiers and input.media replaced size/img_url from wan2.7 on.
|
|
336
|
+
const tieredProtocol = wan27 || wan3;
|
|
337
|
+
// wan2.7 T2V and R2V take an explicit aspect ratio (I2V follows the input
|
|
338
|
+
// image); wan3 serves every mode from one id, so it always takes one.
|
|
339
|
+
const supportsRatio = wan3 || (wan27 && mode !== 'i2v');
|
|
340
|
+
|
|
341
|
+
// Handle image input for I2V mode (wan3 carries frames in input.media)
|
|
342
|
+
if (!wan3 && mode === 'i2v' && startImage != null) {
|
|
307
343
|
input.img_url = fileToImageString(startImage);
|
|
308
344
|
}
|
|
309
345
|
|
|
310
|
-
|
|
311
|
-
|
|
346
|
+
if (wan3) {
|
|
347
|
+
// The media the request carries decides whether this is text-, image-,
|
|
348
|
+
// or reference-to-video, so there is no mode to read off the id. A bare
|
|
349
|
+
// prompt stays text-to-video.
|
|
350
|
+
const media = resolveMedia(options, alibabaOptions, warnings, {
|
|
351
|
+
first: startImage,
|
|
352
|
+
last: getLastFrameImage(options),
|
|
353
|
+
});
|
|
354
|
+
if (media != null) {
|
|
355
|
+
input.media = media;
|
|
356
|
+
}
|
|
357
|
+
} else if (mode === 'r2v') {
|
|
312
358
|
if (wan27) {
|
|
313
359
|
// wan2.7: input.media
|
|
314
|
-
const media = resolveMedia(options, alibabaOptions, warnings
|
|
360
|
+
const media = resolveMedia(options, alibabaOptions, warnings, {
|
|
361
|
+
first: getFirstFrameImage(options),
|
|
362
|
+
});
|
|
315
363
|
if (media != null) {
|
|
316
364
|
input.media = media;
|
|
317
365
|
}
|
|
@@ -328,11 +376,10 @@ export class AlibabaVideoModel implements VideoModelV4 {
|
|
|
328
376
|
}
|
|
329
377
|
}
|
|
330
378
|
|
|
331
|
-
const lastFrame = options
|
|
332
|
-
frame => frame.frameType === 'last_frame',
|
|
333
|
-
)?.image;
|
|
379
|
+
const lastFrame = getLastFrameImage(options);
|
|
334
380
|
|
|
335
|
-
|
|
381
|
+
// wan3 has a real closing-frame slot, filled in input.media above.
|
|
382
|
+
if (lastFrame != null && !wan3) {
|
|
336
383
|
warnings.push({
|
|
337
384
|
type: 'unsupported',
|
|
338
385
|
feature: 'frameImages',
|
|
@@ -345,7 +392,8 @@ export class AlibabaVideoModel implements VideoModelV4 {
|
|
|
345
392
|
if (
|
|
346
393
|
options.inputReferences != null &&
|
|
347
394
|
options.inputReferences.length > 0 &&
|
|
348
|
-
mode !== 'r2v'
|
|
395
|
+
mode !== 'r2v' &&
|
|
396
|
+
!wan3
|
|
349
397
|
) {
|
|
350
398
|
warnings.push({
|
|
351
399
|
type: 'unsupported',
|
|
@@ -369,17 +417,22 @@ export class AlibabaVideoModel implements VideoModelV4 {
|
|
|
369
417
|
|
|
370
418
|
// Resolution / Size mapping
|
|
371
419
|
if (options.resolution != null) {
|
|
372
|
-
if (mode === 'i2v' ||
|
|
373
|
-
// I2V
|
|
420
|
+
if (mode === 'i2v' || tieredProtocol) {
|
|
421
|
+
// I2V, wan2.7, and wan3 use the "720P" / "1080P" tier format
|
|
374
422
|
const resolutionTier =
|
|
375
423
|
resolutionTierMap[options.resolution] || options.resolution;
|
|
376
|
-
|
|
424
|
+
// wan3 adds a 480P tier to wan2.7's two.
|
|
425
|
+
const supportedTiers = wan3
|
|
426
|
+
? ['480P', '720P', '1080P']
|
|
427
|
+
: ['720P', '1080P'];
|
|
428
|
+
if (tieredProtocol && !supportedTiers.includes(resolutionTier)) {
|
|
377
429
|
warnings.push({
|
|
378
430
|
type: 'unsupported',
|
|
379
431
|
feature: 'resolution',
|
|
380
432
|
details:
|
|
381
|
-
'wan2.7 models only support
|
|
382
|
-
|
|
433
|
+
`${wan3 ? 'wan3' : 'wan2.7'} models only support the ` +
|
|
434
|
+
`${supportedTiers.join(', ')} resolution tiers. ` +
|
|
435
|
+
`The resolution "${options.resolution}" was ignored.`,
|
|
383
436
|
});
|
|
384
437
|
} else {
|
|
385
438
|
parameters.resolution = resolutionTier;
|
|
@@ -409,14 +462,14 @@ export class AlibabaVideoModel implements VideoModelV4 {
|
|
|
409
462
|
parameters.prompt_extend = alibabaOptions.promptExtend;
|
|
410
463
|
}
|
|
411
464
|
if (alibabaOptions?.shotType != null) {
|
|
412
|
-
if (
|
|
465
|
+
if (tieredProtocol) {
|
|
413
466
|
// wan2.7 removed shot_type; shot structure is described in the prompt
|
|
414
467
|
warnings.push({
|
|
415
468
|
type: 'unsupported',
|
|
416
469
|
feature: 'shotType',
|
|
417
470
|
details:
|
|
418
|
-
'wan2.7 models do not support the shotType
|
|
419
|
-
'Describe the shot structure in the prompt instead.',
|
|
471
|
+
`${wan3 ? 'wan3' : 'wan2.7'} models do not support the shotType ` +
|
|
472
|
+
'option. Describe the shot structure in the prompt instead.',
|
|
420
473
|
});
|
|
421
474
|
} else {
|
|
422
475
|
parameters.shot_type = alibabaOptions.shotType;
|
|
@@ -525,6 +578,20 @@ export class AlibabaVideoModel implements VideoModelV4 {
|
|
|
525
578
|
statusResponse.usage.output_video_duration,
|
|
526
579
|
resolution: statusResponse.usage.SR,
|
|
527
580
|
size: statusResponse.usage.size,
|
|
581
|
+
// wan3-only. Spread rather than set to undefined so the
|
|
582
|
+
// metadata shape for older wan models is unchanged.
|
|
583
|
+
...(statusResponse.usage.input_video_duration != null
|
|
584
|
+
? {
|
|
585
|
+
inputVideoDuration:
|
|
586
|
+
statusResponse.usage.input_video_duration,
|
|
587
|
+
}
|
|
588
|
+
: {}),
|
|
589
|
+
...(statusResponse.usage.fps != null
|
|
590
|
+
? { fps: statusResponse.usage.fps }
|
|
591
|
+
: {}),
|
|
592
|
+
...(statusResponse.usage.ratio != null
|
|
593
|
+
? { ratio: statusResponse.usage.ratio }
|
|
594
|
+
: {}),
|
|
528
595
|
},
|
|
529
596
|
}
|
|
530
597
|
: {}),
|