@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 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 (for wan2.6 I2V/R2V models;
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 for reference-to-video mode (wan2.7 models).
134
- * Overrides the automatic mapping from `inputReferences` and `frameImages`.
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 videos are counted separately, in array order).
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(["reference_image", "reference_video", "first_frame"]),
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 isWan27Model(modelId) {
1034
- return modelId.startsWith("wan2.7");
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
- const firstFrame = getFirstFrameImage(options);
1112
- if (firstFrame != null) {
1129
+ if (frames.first != null) {
1113
1130
  media.push({
1114
1131
  type: "first_frame",
1115
- url: convertImageModelFileToDataUri(firstFrame)
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, _d, _e;
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 wan27 = isWan27Model(this.modelId);
1173
- const supportsRatio = wan27 && mode !== "i2v";
1174
- if (mode === "i2v" && startImage != null) {
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 (mode === "r2v") {
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 = (_b = (_a = options.frameImages) == null ? void 0 : _a.find(
1195
- (frame) => frame.frameType === "last_frame"
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" || wan27) {
1253
+ if (mode === "i2v" || tieredProtocol) {
1220
1254
  const resolutionTier = resolutionTierMap[options.resolution] || options.resolution;
1221
- if (wan27 && resolutionTier !== "720P" && resolutionTier !== "1080P") {
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: `wan2.7 models only support 720P and 1080P resolutions. The resolution "${options.resolution}" was ignored.`
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 = (_d = (_c = alibabaOptions == null ? void 0 : alibabaOptions.ratio) != null ? _c : options.aspectRatio) != null ? _d : options.resolution != null ? deriveRatioFromResolution(options.resolution) : void 0;
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 (wan27) {
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 = (_e = options.generateAudio) != null ? _e : alibabaOptions == null ? void 0 : alibabaOptions.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.33" : "0.0.0-test";
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":";AAAA;AAAA,EACE;AAAA,OAKK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;;;ACFP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,uCAAuC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP,SAAS,KAAAA,UAAS;;;AC3BlB,SAAS,SAAS;AA+BX,IAAM,kCAAkC,EAAE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOtD,gBAAgB,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKrC,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO/C,mBAAmB,EAAE,QAAQ,EAAE,SAAS;AAC1C,CAAC;;;ACnDD,SAAS,sCAAsC;AAC/C,SAAS,KAAAC,UAAS;AAElB,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EACtC,OAAOA,GAAE,OAAO;AAAA,IACd,SAASA,GAAE,OAAO;AAAA,IAClB,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACzB,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC3B,CAAC;AACH,CAAC;AAIM,IAAM,+BAA+B,+BAA+B;AAAA,EACzE,aAAa;AAAA,EACb,gBAAgB,UAAQ,KAAK,MAAM;AACrC,CAAC;;;AChBD;AAAA,EACE;AAAA,OAGK;AAMA,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AACF,GAOE;AAEA,WAAQ,+BAAO,UAAS,QAAQ;AAEhC,QAAM,eAAkC,CAAC;AAEzC,MAAI,SAAS,MAAM;AACjB,WAAO,EAAE,OAAO,QAAW,YAAY,QAAW,aAAa;AAAA,EACjE;AAEA,QAAM,eAA2C,CAAC;AAElD,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,YAAY;AAC5B,mBAAa,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,SAAS,yBAAyB,KAAK,EAAE;AAAA,MAC3C,CAAC;AAAA,IACH,OAAO;AACL,mBAAa,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,KAAK;AAAA,UACX,aAAa,KAAK;AAAA,UAClB,YAAY,KAAK;AAAA,UACjB,GAAI,KAAK,UAAU,OAAO,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,QACvD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,cAAc,MAAM;AACtB,WAAO,EAAE,OAAO,cAAc,YAAY,QAAW,aAAa;AAAA,EACpE;AAEA,QAAM,OAAO,WAAW;AAExB,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,OAAO,cAAc,YAAY,MAAM,aAAa;AAAA,IAC/D,KAAK;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,UACV,MAAM;AAAA,UACN,UAAU,EAAE,MAAM,WAAW,SAAS;AAAA,QACxC;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS;AACP,YAAM,mBAA0B;AAChC,YAAM,IAAI,8BAA8B;AAAA,QACtC,eAAe,qBAAqB,gBAAgB;AAAA,MACtD,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AC7EA,SAAS,oCAAoC;AAgCtC,SAAS,oBACd,OACsB;AAnCxB;AAoCE,MAAI,SAAS,MAAM;AACjB,WAAO,6BAA6B;AAAA,EACtC;AAEA,QAAM,gBAAe,WAAM,kBAAN,YAAuB;AAC5C,QAAM,oBAAmB,WAAM,sBAAN,YAA2B;AACpD,QAAM,mBAAkB,iBAAM,0BAAN,mBAA6B,kBAA7B,YAA8C;AACtE,QAAM,oBACJ,iBAAM,0BAAN,mBAA6B,gCAA7B,YAA4D;AAC9D,QAAM,mBACJ,iBAAM,8BAAN,mBAAiC,qBAAjC,YAAqD;AAEvD,SAAO;AAAA,IACL,aAAa;AAAA,MACX,OAAO;AAAA;AAAA,MAEP,SAAS,eAAe,kBAAkB;AAAA,MAC1C,WAAW;AAAA,MACX,YAAY;AAAA,IACd;AAAA,IACA,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,MAAM,mBAAmB;AAAA,MACzB,WAAW;AAAA,IACb;AAAA,IACA,KAAK;AAAA,EACP;AACF;;;AC/DA;AAAA,EACE,iCAAAC;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAIP,SAAS,eAAe,EAAE,KAAK,GAA8C;AAC3E,MAAI,KAAK,KAAK,SAAS,OAAO;AAC5B,WAAO,KAAK,KAAK,IAAI,SAAS;AAAA,EAChC;AAEA,MAAI,KAAK,KAAK,SAAS,QAAQ;AAC7B,WAAO,QAAQ,qBAAqB,EAAE,KAAK,CAAC,CAAC,WAAW,gBAAgB,KAAK,KAAK,IAAI,CAAC;AAAA,EACzF;AAEA,QAAM,IAAIA,+BAA8B;AAAA,IACtC,eAAe,uBAAuB,KAAK,KAAK,IAAI;AAAA,EACtD,CAAC;AACH;AAEO,SAAS,6BAA6B;AAAA,EAC3C;AAAA,EACA;AACF,GAGsB;AAjCtB;AAkCE,QAAM,WAA8B,CAAC;AAErC,aAAW,EAAE,MAAM,SAAS,GAAG,QAAQ,KAAK,QAAQ;AAClD,UAAM,sBAAsB,+DAAuB;AAAA,MACjD,QAAQ;AAAA;AAGV,YAAQ,MAAM;AAAA,MACZ,KAAK,UAAU;AACb,YAAI,qBAAqB;AACvB,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,eAAe;AAAA,cACjB;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH,OAAO;AACL,mBAAS,KAAK,EAAE,MAAM,UAAU,QAAQ,CAAC;AAAA,QAC3C;AACA;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,QAAQ,IAAI,CAAC,MAAM,UAAU;AA/DhD,gBAAAC;AAgEY,kBAAM,aAAa,UAAU,QAAQ,SAAS;AAC9C,kBAAM,oBACJA,MAAA,+DAAuB,gBAAgB,KAAK,qBAA5C,OAAAA,MACC,aAAa,sBAAsB;AAEtC,oBAAQ,KAAK,MAAM;AAAA,cACjB,KAAK,QAAQ;AACX,uBAAO;AAAA,kBACL,MAAM;AAAA,kBACN,MAAM,KAAK;AAAA,kBACX,GAAI,mBACA,EAAE,eAAe,iBAAiB,IAClC,CAAC;AAAA,gBACP;AAAA,cACF;AAAA,cAEA,KAAK,QAAQ;AACX,wBAAQ,KAAK,KAAK,MAAM;AAAA,kBACtB,KAAK,aAAa;AAChB,0BAAM,IAAID,+BAA8B;AAAA,sBACtC,eAAe;AAAA,oBACjB,CAAC;AAAA,kBACH;AAAA,kBACA,KAAK,QAAQ;AACX,0BAAM,IAAIA,+BAA8B;AAAA,sBACtC,eAAe;AAAA,oBACjB,CAAC;AAAA,kBACH;AAAA,kBACA,KAAK;AAAA,kBACL,KAAK,QAAQ;AACX,wBAAI,qBAAqB,KAAK,SAAS,MAAM,SAAS;AACpD,6BAAO;AAAA,wBACL,MAAM;AAAA,wBACN,WAAW;AAAA,0BACT,KAAK,eAAe,EAAE,KAAK,CAAC;AAAA,wBAC9B;AAAA,wBACA,GAAI,mBACA,EAAE,eAAe,iBAAiB,IAClC,CAAC;AAAA,sBACP;AAAA,oBACF,OAAO;AACL,4BAAM,IAAIA,+BAA8B;AAAA,wBACtC,eAAe;AAAA,sBACjB,CAAC;AAAA,oBACH;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,aAAa;AAChB,YAAI,OAAO;AACX,cAAM,YAID,CAAC;AAEN,mBAAW,QAAQ,SAAS;AAC1B,kBAAQ,KAAK,MAAM;AAAA,YACjB,KAAK,QAAQ;AACX,sBAAQ,KAAK;AACb;AAAA,YACF;AAAA,YACA,KAAK,aAAa;AAChB,wBAAU,KAAK;AAAA,gBACb,IAAI,KAAK;AAAA,gBACT,MAAM;AAAA,gBACN,UAAU;AAAA,kBACR,MAAM,KAAK;AAAA,kBACX,WAAW,KAAK,UAAU,KAAK,KAAK;AAAA,gBACtC;AAAA,cACF,CAAC;AACD;AAAA,YACF;AAAA,YACA,KAAK,aAAa;AAEhB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,KAAK,WAAW,KAAK,UAAU,WAAW,GAAG;AAC/C;AAAA,QACF;AAEA,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,sBACL,CAAC,EAAE,MAAM,QAAQ,MAAM,eAAe,oBAAoB,CAAC,IAC3D,QAAQ;AAAA,UACZ,YAAY,UAAU,SAAS,IAAI,YAAY;AAAA,QACjD,CAAC;AAED;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,cAAM,gBAAgB,QAAQ;AAAA,UAC5B,OAAK,EAAE,SAAS;AAAA,QAClB;AAEA,iBAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,gBAAM,eAAe,cAAc,CAAC;AACpC,gBAAM,SAAS,aAAa;AAC5B,gBAAM,aAAa,MAAM,cAAc,SAAS;AAEhD,gBAAM,oBACJ,oEAAuB;AAAA,YACrB,aAAa;AAAA,gBADf,YAEM,aAAa,sBAAsB;AAE3C,cAAI;AACJ,kBAAQ,OAAO,MAAM;AAAA,YACnB,KAAK;AAAA,YACL,KAAK;AACH,6BAAe,OAAO;AACtB;AAAA,YACF,KAAK;AACH,8BAAe,YAAO,WAAP,YAAiB;AAChC;AAAA,YACF,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AACH,6BAAe,KAAK,UAAU,OAAO,KAAK;AAC1C;AAAA,UACJ;AAEA,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,cAAc,aAAa;AAAA,YAC3B,SAAS,mBACL;AAAA,cACE;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,eAAe;AAAA,cACjB;AAAA,YACF,IACA;AAAA,UACN,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAAA,MAEA,SAAS;AACP,cAAM,mBAA0B;AAChC,cAAM,IAAI,MAAM,qBAAqB,gBAAgB,EAAE;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACtNA,IAAM,wBAAwB;AAE9B,SAAS,gBACP,kBACiC;AAXnC;AAYE,QAAME,WAAU,qDAAkB;AAElC,QAAM,qBAAoB,KAAAA,YAAA,gBAAAA,SAAS,iBAAT,YAAyBA,YAAA,gBAAAA,SAAS;AAI5D,SAAO;AACT;AAEO,IAAM,wBAAN,MAA4B;AAAA,EAA5B;AACL,SAAQ,kBAAkB;AAC1B,SAAQ,WAA8B,CAAC;AAAA;AAAA,EAEvC,gBACE,kBACiC;AACjC,UAAM,oBAAoB,gBAAgB,gBAAgB;AAE1D,QAAI,CAAC,mBAAmB;AACtB,aAAO;AAAA,IACT;AAEA,SAAK;AACL,QAAI,KAAK,kBAAkB,uBAAuB;AAChD,WAAK,SAAS,KAAK;AAAA,QACjB,MAAM;AAAA,QACN,SAAS,gDAAgD,qBAAqB;AAAA,MAChF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,cAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AACF;;;AC9CO,SAAS,uBACd,cACwC;AACxC,UAAQ,cAAc;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;AP+BO,IAAM,2BAAN,MAAM,0BAAoD;AAAA,EAoB/D,YAAY,SAA6B,QAAuB;AAnBhE,SAAS,uBAAuB;AA4BhC,SAAS,gBAA0C;AAAA,MACjD,WAAW,CAAC,iBAAiB;AAAA,IAC/B;AAVE,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAChB;AAAA,EAjBA,QAAQ,kBAAkB,EAAE,OAAiC;AAC3D,WAAO,sBAAsB;AAAA,MAC3B,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ,oBAAoB,EAAE,SAG3B;AACD,WAAO,IAAI,0BAAyB,QAAQ,SAAS,QAAQ,MAAM;AAAA,EACrE;AAAA,EAOA,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAA+B;AArGjC;AAsGI,UAAM,WAA8B,CAAC;AAErC,UAAM,wBAAwB,IAAI,sBAAsB;AAExD,UAAM,iBAAiB,MAAM,qBAAqB;AAAA,MAChD,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAGD,QAAI,oBAAoB,MAAM;AAC5B,eAAS,KAAK,EAAE,MAAM,eAAe,SAAS,mBAAmB,CAAC;AAAA,IACpE;AAGA,UAAM,WAAW;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,YAAY;AAAA,MACZ;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,kBAAkB;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA,kBACE,iDAAgB,UAAS,SACrB,eAAe,UAAU,OACvB;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,UACX,QAAQ,eAAe;AAAA,UACvB,OAAM,oBAAe,SAAf,YAAuB;AAAA,UAC7B,aAAa,eAAe;AAAA,QAC9B;AAAA,MACF,IACA,EAAE,MAAM,cAAc,IACxB;AAAA,MAEN,GAAG,uBAAuB;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA;AAAA,MAGD,UAAU,6BAA6B;AAAA,QACrC;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAGA,UAAM;AAAA,MACJ,OAAO;AAAA,MACP,YAAY;AAAA,MACZ;AAAA,IACF,IAAI,aAAa,EAAE,OAAO,WAAW,CAAC;AAEtC,aAAS,KAAK,GAAG,sBAAsB,YAAY,CAAC;AAEpD,WAAO;AAAA,MACL,MAAM;AAAA,QACJ,GAAG;AAAA,QACH,OAAO;AAAA,QACP,aAAa;AAAA,QACb,GAAI,gBAAgB,SACpB,iDAAgB,uBAAsB,SAClC,EAAE,qBAAqB,eAAe,kBAAkB,IACxD,CAAC;AAAA,MACP;AAAA,MACA,UAAU,CAAC,GAAG,UAAU,GAAG,YAAY;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAM,WACJ,SACwC;AAnL5C;AAoLI,UAAM,EAAE,MAAM,SAAS,IAAI,MAAM,KAAK,QAAQ,OAAO;AAErD,UAAM;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,IAAI,MAAM,cAAc;AAAA,MACtB,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,MAC3B,SAAS,gBAAe,gBAAK,QAAO,YAAZ,6BAAyB,QAAQ,OAAO;AAAA,MAChE,MAAM;AAAA,MACN,uBAAuB;AAAA,MACvB,2BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,SAAS,SAAS,QAAQ,CAAC;AACjC,UAAM,UAAyC,CAAC;AAGhD,UAAM,OAAO,OAAO,QAAQ;AAC5B,QAAI,QAAQ,QAAQ,KAAK,SAAS,GAAG;AACnC,cAAQ,KAAK,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,IACrC;AAGA,UAAM,YAAY,OAAO,QAAQ;AACjC,QAAI,aAAa,QAAQ,UAAU,SAAS,GAAG;AAC7C,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAGA,QAAI,OAAO,QAAQ,cAAc,MAAM;AACrC,iBAAW,YAAY,OAAO,QAAQ,YAAY;AAChD,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,YAAY,SAAS,MAAM,WAAW;AAAA,UACtC,UAAU,SAAS,SAAS;AAAA,UAC5B,OAAO,SAAS,SAAS;AAAA,QAC3B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,cAAc;AAAA,QACZ,SAAS,uBAAuB,OAAO,aAAa;AAAA,QACpD,MAAK,YAAO,kBAAP,YAAwB;AAAA,MAC/B;AAAA,MACA,OAAO,oBAAoB,SAAS,KAAK;AAAA,MACzC,SAAS,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,MACtC,UAAU;AAAA,QACR,GAAG,oBAAoB,QAAQ;AAAA,QAC/B,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,SACsC;AAvP1C;AAwPI,UAAM,EAAE,MAAM,SAAS,IAAI,MAAM,KAAK,QAAQ,OAAO;AACrD,UAAM,OAAO;AAAA,MACX,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,gBAAgB,KAAK,OAAO,eACxB,EAAE,eAAe,KAAK,IACtB;AAAA,IACN;AAEA,UAAM,EAAE,iBAAiB,OAAO,SAAS,IAAI,MAAM,cAAc;AAAA,MAC/D,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,MAC3B,SAAS,gBAAe,gBAAK,QAAO,YAAZ,6BAAyB,QAAQ,OAAO;AAAA,MAChE;AAAA,MACA,uBAAuB;AAAA,MACvB,2BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAGD,QAAI,eAA4C;AAAA,MAC9C,SAAS;AAAA,MACT,KAAK;AAAA,IACP;AACA,QAAI,QAAwD;AAE5D,QAAI,eAAe;AACnB,QAAI,aAAa;AACjB,QAAI,oBAAmC;AAEvC,QAAI;AAEJ,WAAO;AAAA,MACL,QAAQ,SAAS;AAAA,QACf,IAAI,gBAGF;AAAA,UACA,MAAM,YAAY;AAChB,8BAAkB,IAAI,yBAAyB,YAAY;AAAA,cACzD;AAAA,YACF,CAAC;AACD,uBAAW,QAAQ,EAAE,MAAM,gBAAgB,SAAS,CAAC;AAAA,UACvD;AAAA,UAEA,UAAU,OAAO,YAAY;AAE3B,gBAAI,QAAQ,kBAAkB;AAC5B,yBAAW,QAAQ,EAAE,MAAM,OAAO,UAAU,MAAM,SAAS,CAAC;AAAA,YAC9D;AAGA,gBAAI,CAAC,MAAM,SAAS;AAClB,yBAAW,QAAQ,EAAE,MAAM,SAAS,OAAO,MAAM,MAAM,CAAC;AACxD;AAAA,YACF;AAEA,kBAAM,QAAQ,MAAM;AAGpB,gBAAI,cAAc;AAChB,6BAAe;AACf,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,GAAG,oBAAoB,KAAK;AAAA,cAC9B,CAAC;AAAA,YACH;AAGA,gBAAI,MAAM,SAAS,MAAM;AACvB,sBAAQ,MAAM;AAAA,YAChB;AAGA,gBAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B;AAAA,YACF;AAEA,kBAAM,SAAS,MAAM,QAAQ,CAAC;AAC9B,kBAAM,QAAQ,OAAO;AAGrB,gBACE,MAAM,qBAAqB,QAC3B,MAAM,kBAAkB,SAAS,GACjC;AACA,kBAAI,qBAAqB,MAAM;AAE7B,oBAAI,YAAY;AACd,6BAAW,QAAQ,EAAE,MAAM,YAAY,IAAI,IAAI,CAAC;AAChD,+BAAa;AAAA,gBACf;AAEA,oCAAoB,WAAW;AAC/B,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN,IAAI;AAAA,gBACN,CAAC;AAAA,cACH;AAEA,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,OAAO,MAAM;AAAA,cACf,CAAC;AAAA,YACH;AAGA,gBAAI,MAAM,WAAW,QAAQ,MAAM,QAAQ,SAAS,GAAG;AAErD,kBAAI,qBAAqB,MAAM;AAC7B,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN,IAAI;AAAA,gBACN,CAAC;AACD,oCAAoB;AAAA,cACtB;AAEA,kBAAI,CAAC,YAAY;AACf,2BAAW,QAAQ,EAAE,MAAM,cAAc,IAAI,IAAI,CAAC;AAClD,6BAAa;AAAA,cACf;AAEA,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,OAAO,MAAM;AAAA,cACf,CAAC;AAAA,YACH;AAGA,gBAAI,MAAM,cAAc,MAAM;AAE5B,kBAAI,qBAAqB,MAAM;AAC7B,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN,IAAI;AAAA,gBACN,CAAC;AACD,oCAAoB;AAAA,cACtB;AACA,kBAAI,YAAY;AACd,2BAAW,QAAQ,EAAE,MAAM,YAAY,IAAI,IAAI,CAAC;AAChD,6BAAa;AAAA,cACf;AAEA,yBAAW,iBAAiB,MAAM,YAAY;AAC5C,gCAAgB,aAAa,aAAa;AAAA,cAC5C;AAAA,YACF;AAGA,gBAAI,OAAO,iBAAiB,MAAM;AAChC,6BAAe;AAAA,gBACb,SAAS,uBAAuB,OAAO,aAAa;AAAA,gBACpD,KAAK,OAAO;AAAA,cACd;AAAA,YACF;AAAA,UACF;AAAA,UAEA,MAAM,YAAY;AAChB,gBAAI,qBAAqB,MAAM;AAC7B,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,cACN,CAAC;AAAA,YACH;AAEA,gBAAI,YAAY;AACd,yBAAW,QAAQ,EAAE,MAAM,YAAY,IAAI,IAAI,CAAC;AAAA,YAClD;AAEA,4BAAgB,MAAM;AAEtB,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN;AAAA,cACA,OAAO,oBAAoB,KAAK;AAAA,YAClC,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,SAAS,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,MACtC,UAAU,EAAE,SAAS,gBAAgB;AAAA,IACvC;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAM4D;AAC1D,OACE,iDAAgB,mBAAkB,SAClC,iDAAgB,mBAAkB,MAClC;AACA,WAAO;AAAA,MACL,GAAI,eAAe,kBAAkB,OACjC,EAAE,iBAAiB,eAAe,eAAe,IACjD,CAAC;AAAA,MACL,GAAI,eAAe,kBAAkB,OACjC,EAAE,iBAAiB,eAAe,eAAe,IACjD,CAAC;AAAA,IACP;AAAA,EACF;AAEA,MAAI,CAAC,kBAAkB,SAAS,GAAG;AACjC,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,cAAc,QAAQ;AACxB,WAAO,EAAE,iBAAiB,MAAM;AAAA,EAClC;AAEA,QAAM,iBAAiB,6BAA6B;AAAA,IAClD;AAAA,IACA,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,GAAI,kBAAkB,OAAO,EAAE,iBAAiB,eAAe,IAAI,CAAC;AAAA,EACtE;AACF;AAMA,IAAM,qBAAqBC,GAAE,YAAY;AAAA,EACvC,eAAeA,GAAE,OAAO;AAAA,EACxB,mBAAmBA,GAAE,OAAO;AAAA,EAC5B,cAAcA,GAAE,OAAO;AAAA,EACvB,uBAAuBA,GACpB,YAAY;AAAA,IACX,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAClC,6BAA6BA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAChD,YAAYA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,CAAC,EACA,QAAQ;AAAA,EACX,2BAA2BA,GACxB,YAAY;AAAA,IACX,kBAAkBA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACvC,CAAC,EACA,QAAQ;AACb,CAAC;AAED,IAAM,4BAA4BA,GAAE,OAAO;AAAA,EACzC,IAAIA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACvB,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC5B,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC1B,SAASA,GAAE;AAAA,IACTA,GAAE,OAAO;AAAA,MACP,SAASA,GAAE,OAAO;AAAA,QAChB,MAAMA,GAAE,QAAQ,WAAW,EAAE,QAAQ;AAAA,QACrC,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC5B,mBAAmBA,GAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,QACtC,YAAYA,GACT;AAAA,UACCA,GAAE,OAAO;AAAA,YACP,IAAIA,GAAE,OAAO;AAAA,YACb,MAAMA,GAAE,QAAQ,UAAU;AAAA,YAC1B,UAAUA,GAAE,OAAO;AAAA,cACjB,MAAMA,GAAE,OAAO;AAAA,cACf,WAAWA,GAAE,OAAO;AAAA,YACtB,CAAC;AAAA,UACH,CAAC;AAAA,QACH,EACC,QAAQ;AAAA,MACb,CAAC;AAAA,MACD,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,MAClC,OAAOA,GAAE,OAAO;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EACA,OAAO,mBAAmB,QAAQ;AACpC,CAAC;AAED,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EACtC,IAAIA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACvB,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC5B,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC1B,SAASA,GAAE;AAAA,IACTA,GAAE,OAAO;AAAA,MACP,OAAOA,GAAE,OAAO;AAAA,QACd,MAAMA,GAAE,KAAK,CAAC,WAAW,CAAC,EAAE,QAAQ;AAAA,QACpC,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC5B,mBAAmBA,GAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,QACtC,YAAYA,GACT;AAAA,UACCA,GAAE,OAAO;AAAA,YACP,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA;AAAA,YAC1B,IAAIA,GAAE,OAAO,EAAE,QAAQ;AAAA,YACvB,MAAMA,GAAE,QAAQ,UAAU,EAAE,QAAQ;AAAA,YACpC,UAAUA,GACP,OAAO;AAAA,cACN,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,cACzB,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,YAChC,CAAC,EACA,QAAQ;AAAA,UACb,CAAC;AAAA,QACH,EACC,QAAQ;AAAA,MACb,CAAC;AAAA,MACD,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,MAClC,OAAOA,GAAE,OAAO;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EACA,OAAO,mBAAmB,QAAQ;AAAA;AACpC,CAAC;;;AQtjBD;AAAA,EACE;AAAA,EACA,iCAAAC;AAAA,OAEK;AACP;AAAA,EACE,kBAAAC;AAAA,EACA,kCAAAC;AAAA,EACA,6BAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,yBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,wBAAAC;AAAA,OACK;AACP,SAAS,KAAAC,UAAS;;;ACflB,SAAS,KAAAC,UAAS;AAOX,IAAM,+BAA+BA,GAAE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnD,UAAUA,GAAE,KAAK,CAAC,SAAS,UAAU,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjD,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/B,YAAYA,GAAE,KAAK,CAAC,SAAS,UAAU,cAAc,CAAC,EAAE,SAAS;AACnE,CAAC;;;ADLD,IAAM,wCAAwCC,gCAA+B;AAAA,EAC3E,aAAaC,GAAE,OAAO;AAAA,IACpB,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACzB,SAASA,GAAE,OAAO;AAAA,IAClB,YAAYA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,CAAC;AAAA,EACD,gBAAgB,UAAQ,KAAK;AAC/B,CAAC;AAEM,IAAM,wBAAN,MAAM,uBAAkD;AAAA,EAsB7D,YAAY,SAAkC,QAAuB;AArBrE,SAAS,uBAAuB;AAEhC,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;AAmB/B,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAChB;AAAA,EAjBA,QAAQC,mBAAkB,EAAE,OAA8B;AACxD,WAAOC,uBAAsB;AAAA,MAC3B,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEA,QAAQC,qBAAoB,EAAE,SAG3B;AACD,WAAO,IAAI,uBAAsB,QAAQ,SAAS,QAAQ,MAAM;AAAA,EAClE;AAAA,EAOA,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,MAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAEE;AAtEJ;AAuEI,QAAI,OAAO,SAAS,KAAK,sBAAsB;AAC7C,YAAM,IAAI,mCAAmC;AAAA,QAC3C,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,sBAAsB,KAAK;AAAA,QAC3B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,iBAAiB,MAAMC,sBAAqB;AAAA,MAChD,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAGD,SAAI,iDAAgB,gBAAe,UAAU;AAC3C,YAAM,IAAIC,+BAA8B;AAAA,QACtC,eAAe;AAAA,QACf,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,MACP;AAAA,IACF,IAAI,MAAMC,eAAc;AAAA,MACtB,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,MAC3B,SAASC,iBAAe,gBAAK,QAAO,YAAZ,6BAAyB,OAAO;AAAA,MACxD,MAAM;AAAA,QACJ,OAAO,KAAK;AAAA,QACZ,OAAO;AAAA,UACL,OAAO;AAAA,QACT;AAAA,QACA,YAAY;AAAA,UACV,WAAW,iDAAgB;AAAA,UAC3B,WAAW,iDAAgB;AAAA,UAC3B,aAAa,iDAAgB;AAAA,QAC/B;AAAA,MACF;AAAA,MACA,uBAAuB;AAAA,MACvB,2BAA2BC;AAAA,QACzB;AAAA,MACF;AAAA,MACA;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,mBAAmB,SAAS,OAAO,WAAW;AAAA,MAClD,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE;AAAA,IAC7B;AACA,UAAM,mBAAmB,iBACtB;AAAA,MAAI,UACH,KAAK,oBAAoB,OACrB,SACA;AAAA,QACE,WAAW,KAAK;AAAA,QAChB,iBAAiB,KAAK;AAAA,MACxB;AAAA,IACN,EACC,OAAO,UAAQ,QAAQ,IAAI;AAE9B,WAAO;AAAA,MACL,UAAU,CAAC;AAAA,MACX,YAAY,iBAAiB,IAAI,UAAQ,KAAK,SAAS;AAAA,MACvD,OAAO,SAAS,QACZ,EAAE,QAAQ,SAAS,MAAM,aAAa,IACtC;AAAA,MACJ,kBACE,iBAAiB,SAAS,IACtB;AAAA,QACE,SAAS;AAAA,UACP;AAAA,QACF;AAAA,MACF,IACA;AAAA,MACN,UAAU,EAAE,SAAS,iBAAiB,MAAM,SAAS;AAAA,IACvD;AAAA,EACF;AACF;AAEA,IAAM,4CAA4CR,GAAE,OAAO;AAAA,EACzD,OAAOA,GAAE,OAAO;AAAA,EAChB,OAAOA,GAAE,OAAO;AAAA,EAChB,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAC5B,CAAC;AAED,IAAM,qCAAqCA,GAAE,OAAO;AAAA,EAClD,QAAQA,GAAE,OAAO;AAAA,IACf,YAAYA,GAAE;AAAA,MACZA,GAAE,OAAO;AAAA,QACP,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,QAC7B,YAAYA,GAAE,OAAO;AAAA,QACrB,kBAAkBA,GACf,MAAM,yCAAyC,EAC/C,QAAQ;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAAA,EACD,OAAOA,GACJ,OAAO;AAAA,IACN,cAAcA,GAAE,OAAO;AAAA,EACzB,CAAC,EACA,QAAQ;AACb,CAAC;;;AEjLD;AAAA,EACE;AAAA,OAQK;AACP;AAAA,EACE,kBAAAS;AAAA,EACA;AAAA,EACA;AAAA,EACA,kCAAAC;AAAA,EACA,6BAAAC;AAAA,EACA;AAAA,EACA,wBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA;AAAA,OAGK;AACP,SAAS,KAAAC,UAAS;;;ACvBlB,SAAS,YAAY,iBAAiB;AACtC,SAAS,KAAAC,UAAS;AAmDX,IAAM,iCAAiC;AAAA,EAAW,MACvD;AAAA,IACEA,GAAE,YAAY;AAAA,MACZ,gBAAgBA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACnC,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA,MAC7B,cAAcA,GAAE,QAAQ,EAAE,QAAQ;AAAA,MAClC,UAAUA,GAAE,KAAK,CAAC,UAAU,OAAO,CAAC,EAAE,QAAQ;AAAA,MAC9C,WAAWA,GAAE,QAAQ,EAAE,QAAQ;AAAA,MAC/B,OAAOA,GAAE,QAAQ,EAAE,QAAQ;AAAA,MAC3B,eAAeA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ;AAAA,MAC3C,OAAOA,GACJ;AAAA,QACCA,GAAE,OAAO;AAAA,UACP,MAAMA,GAAE,KAAK,CAAC,mBAAmB,mBAAmB,aAAa,CAAC;AAAA,UAClE,KAAKA,GAAE,OAAO;AAAA,UACd,gBAAgBA,GAAE,OAAO,EAAE,QAAQ;AAAA,QACrC,CAAC;AAAA,MACH,EACC,QAAQ;AAAA,MACX,OAAOA,GAAE,KAAK,CAAC,QAAQ,QAAQ,OAAO,OAAO,KAAK,CAAC,EAAE,QAAQ;AAAA,MAC7D,gBAAgBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,MAC9C,eAAeA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC/C,CAAC;AAAA,EACH;AACF;;;ADnCA,IAAM,0BAA0BC,GAAE,OAAO;AAAA,EACvC,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACzB,SAASA,GAAE,OAAO;AAAA,EAClB,YAAYA,GAAE,OAAO,EAAE,QAAQ;AACjC,CAAC;AAED,IAAM,oCAAoCC,gCAA+B;AAAA,EACvE,aAAa;AAAA,EACb,gBAAgB,UAAQ,KAAK;AAC/B,CAAC;AAED,IAAM,+BAA+BD,GAAE,OAAO;AAAA,EAC5C,QAAQA,GACL,OAAO;AAAA,IACN,aAAaA,GAAE,OAAO;AAAA,IACtB,SAASA,GAAE,OAAO;AAAA,EACpB,CAAC,EACA,QAAQ;AAAA,EACX,YAAYA,GAAE,OAAO,EAAE,QAAQ;AACjC,CAAC;AAED,IAAM,+BAA+BA,GAAE,OAAO;AAAA,EAC5C,QAAQA,GACL,OAAO;AAAA,IACN,SAASA,GAAE,OAAO;AAAA,IAClB,aAAaA,GAAE,OAAO;AAAA,IACtB,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC9B,aAAaA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAChC,gBAAgBA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACnC,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC7B,aAAaA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAChC,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAClC,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACzB,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC9B,CAAC,EACA,QAAQ;AAAA,EACX,OAAOA,GACJ,OAAO;AAAA,IACN,UAAUA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC7B,uBAAuBA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAC1C,IAAIA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACvB,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC3B,CAAC,EACA,QAAQ;AAAA,EACX,YAAYA,GAAE,OAAO,EAAE,QAAQ;AACjC,CAAC;AAMD,SAAS,WAAW,SAAwC;AAC1D,MAAI,QAAQ,SAAS,MAAM,EAAG,QAAO;AACrC,MAAI,QAAQ,SAAS,MAAM,EAAG,QAAO;AACrC,SAAO;AACT;AAKA,SAAS,aAAa,SAA0B;AAC9C,SAAO,QAAQ,WAAW,QAAQ;AACpC;AAGA,IAAM,oBAA4C;AAAA,EAChD,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AACb;AAEA,IAAM,kBAAkB,oBAAI,IAAI,CAAC,QAAQ,QAAQ,OAAO,OAAO,KAAK,CAAC;AAErE,SAAS,0BACP,YACoB;AACpB,QAAM,CAAC,OAAO,MAAM,IAAI,WAAW,MAAM,GAAG,EAAE,IAAI,MAAM;AACxD,MACE,CAAC,OAAO,UAAU,KAAK,KACvB,CAAC,OAAO,UAAU,MAAM,KACxB,SAAS,KACT,UAAU,GACV;AACA,WAAO;AAAA,EACT;AACA,MAAI,IAAI;AACR,MAAI,IAAI;AACR,SAAO,MAAM,GAAG;AACd,KAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAAA,EACpB;AACA,QAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,SAAS,CAAC;AACxC,SAAO,gBAAgB,IAAI,KAAK,IAAI,QAAQ;AAC9C;AAEA,SAAS,kBAAkB,MAAgC;AACzD,MAAI,KAAK,SAAS,OAAO;AACvB,WAAO,KAAK;AAAA,EACd;AACA,SAAO,OAAO,KAAK,SAAS,WACxB,KAAK,OACL,0BAA0B,KAAK,IAAI;AACzC;AAEA,SAAS,mBACP,SAC8B;AA5JhC;AA6JE,UAAO,mBAAQ,gBAAR,mBAAqB,KAAK,WAAS,MAAM,cAAc,mBAAvD,mBACH;AACN;AAEA,SAAS,kBACP,SAC8B;AAnKhC;AAoKE,UAAO,wBAAmB,OAAO,MAA1B,YAA+B,QAAQ;AAChD;AAEA,SAAS,WAAW,KAAsB;AACxC,SAAO,uBAAuB,KAAK,GAAG;AACxC;AAGA,SAAS,aACP,SACA,gBACA,UAC4C;AAhL9C;AAiLE,OAAI,iDAAgB,UAAS,QAAQ,eAAe,MAAM,SAAS,GAAG;AACpE,WAAO,eAAe,MAAM,IAAI,WAAS;AAAA,MACvC,MAAM,KAAK;AAAA,MACX,KAAK,KAAK;AAAA,MACV,GAAI,KAAK,kBAAkB,OACvB,EAAE,iBAAiB,KAAK,eAAe,IACvC,CAAC;AAAA,IACP,EAAE;AAAA,EACJ;AAEA,QAAM,QAAwC,CAAC;AAE/C,aAAW,cAAa,aAAQ,oBAAR,YAA2B,CAAC,GAAG;AACrD,QAAI,UAAU,SAAS,OAAO;AAC5B,YAAM,KAAK;AAAA,QACT,MAAM,WAAW,UAAU,GAAG,IAAI,oBAAoB;AAAA,QACtD,KAAK,UAAU;AAAA,MACjB,CAAC;AAAA,IACH,WAAW,UAAU,UAAU,WAAW,QAAQ,GAAG;AACnD,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,KAAK,+BAA+B,SAAS;AAAA,MAC/C,CAAC;AAAA,IACH,OAAO;AACL,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MAEJ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,aAAa,mBAAmB,OAAO;AAC7C,MAAI,cAAc,MAAM;AACtB,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,KAAK,+BAA+B,UAAU;AAAA,IAChD,CAAC;AAAA,EACH;AAEA,SAAO,MAAM,SAAS,IAAI,QAAQ;AACpC;AAEA,SAAS,qBACP,SACA,gBACA,UACsB;AAlOxB;AAmOE,MAAI,QAAQ,eAAe,QAAQ,QAAQ,YAAY,SAAS,GAAG;AACjE,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,mBAAmB,QAAQ,QAAQ,gBAAgB,SAAS,GAAG;AACzE,UAAM,OAAiB,CAAC;AAExB,eAAW,aAAa,QAAQ,iBAAiB;AAC/C,UAAI,UAAU,SAAS,OAAO;AAC5B,aAAK,KAAK,UAAU,GAAG;AAAA,MACzB,OAAO;AACL,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SACE;AAAA,QAEJ,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,KAAK,SAAS,IAAI,OAAO;AAAA,EAClC;AAEA,UAAO,sDAAgB,kBAAhB,YAAiC;AAC1C;AAEO,IAAM,oBAAN,MAAgD;AAAA,EAQrD,YACW,SACQ,QACjB;AAFS;AACQ;AATnB,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAAA,EASzB;AAAA,EAPH,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAOA,MAAc,aACZ,SAMC;AAlRL;AAmRI,UAAM,WAA8B,CAAC;AACrC,UAAM,OAAO,WAAW,KAAK,OAAO;AAEpC,UAAM,iBAAkB,MAAME,sBAAqB;AAAA,MACjD,UAAU;AAAA,MACV,iBAAiB,QAAQ;AAAA,MACzB,QAAQ;AAAA,IACV,CAAC;AAGD,UAAM,QAAiC,CAAC;AAExC,QAAI,QAAQ,UAAU,MAAM;AAC1B,YAAM,SAAS,QAAQ;AAAA,IACzB;AAEA,SAAI,iDAAgB,mBAAkB,MAAM;AAC1C,YAAM,kBAAkB,eAAe;AAAA,IACzC;AAEA,SAAI,iDAAgB,aAAY,MAAM;AACpC,YAAM,YAAY,eAAe;AAAA,IACnC;AAEA,UAAM,aAAa,kBAAkB,OAAO;AAC5C,UAAM,QAAQ,aAAa,KAAK,OAAO;AAEvC,UAAM,gBAAgB,SAAS,SAAS;AAGxC,QAAI,SAAS,SAAS,cAAc,MAAM;AACxC,YAAM,UAAU,kBAAkB,UAAU;AAAA,IAC9C;AAGA,QAAI,SAAS,OAAO;AAClB,UAAI,OAAO;AAET,cAAM,QAAQ,aAAa,SAAS,gBAAgB,QAAQ;AAC5D,YAAI,SAAS,MAAM;AACjB,gBAAM,QAAQ;AAAA,QAChB;AAAA,MACF,OAAO;AAEL,cAAM,gBAAgB;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,iBAAiB,QAAQ,cAAc,SAAS,GAAG;AACrD,gBAAM,iBAAiB;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAY,mBAAQ,gBAAR,mBAAqB;AAAA,MACrC,WAAS,MAAM,cAAc;AAAA,UADb,mBAEf;AAEH,QAAI,aAAa,MAAM;AACrB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MAEJ,CAAC;AAAA,IACH;AAEA,QACE,QAAQ,mBAAmB,QAC3B,QAAQ,gBAAgB,SAAS,KACjC,SAAS,OACT;AACA,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MAEJ,CAAC;AAAA,IACH;AAGA,UAAM,aAAsC,CAAC;AAE7C,QAAI,QAAQ,YAAY,MAAM;AAC5B,iBAAW,WAAW,QAAQ;AAAA,IAChC;AAEA,QAAI,QAAQ,QAAQ,MAAM;AACxB,iBAAW,OAAO,QAAQ;AAAA,IAC5B;AAGA,QAAI,QAAQ,cAAc,MAAM;AAC9B,UAAI,SAAS,SAAS,OAAO;AAE3B,cAAM,iBACJ,kBAAkB,QAAQ,UAAU,KAAK,QAAQ;AACnD,YAAI,SAAS,mBAAmB,UAAU,mBAAmB,SAAS;AACpE,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SACE,0EACgC,QAAQ,UAAU;AAAA,UACtD,CAAC;AAAA,QACH,OAAO;AACL,qBAAW,aAAa;AAAA,QAC1B;AAAA,MACF,OAAO;AAGL,mBAAW,OAAO,QAAQ,WAAW,QAAQ,KAAK,GAAG;AAAA,MACvD;AAAA,IACF;AAGA,QAAI,eAAe;AACjB,YAAM,SACJ,4DAAgB,UAAhB,YACA,QAAQ,gBADR,YAEC,QAAQ,cAAc,OACnB,0BAA0B,QAAQ,UAAU,IAC5C;AACN,UAAI,SAAS,MAAM;AACjB,mBAAW,QAAQ;AAAA,MACrB;AAAA,IACF;AAGA,SAAI,iDAAgB,iBAAgB,MAAM;AACxC,iBAAW,gBAAgB,eAAe;AAAA,IAC5C;AACA,SAAI,iDAAgB,aAAY,MAAM;AACpC,UAAI,OAAO;AAET,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SACE;AAAA,QAEJ,CAAC;AAAA,MACH,OAAO;AACL,mBAAW,YAAY,eAAe;AAAA,MACxC;AAAA,IACF;AACA,SAAI,iDAAgB,cAAa,MAAM;AACrC,iBAAW,YAAY,eAAe;AAAA,IACxC;AACA,UAAM,SAAQ,aAAQ,kBAAR,YAAyB,iDAAgB;AACvD,QAAI,SAAS,MAAM;AACjB,UAAI,OAAO;AAET,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SACE;AAAA,QAEJ,CAAC;AAAA,MACH,OAAO;AACL,mBAAW,QAAQ;AAAA,MACrB;AAAA,IACF;AAGA,QAAI,QAAQ,eAAe,CAAC,eAAe;AACzC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,QAAI,QAAQ,KAAK;AACf,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,QAAI,QAAQ,KAAK,QAAQ,QAAQ,IAAI,GAAG;AACtC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,OAAO,YAAY,UAAU,eAAe;AAAA,EACvD;AAAA,EAEQ,qBACN,gBACA,iBACA,UACA,aAWA;AAteJ;AAueI,UAAM,UAAS,oBAAe,WAAf,mBAAuB;AACtC,UAAM,YAAW,oBAAe,WAAf,mBAAuB;AAExC,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,sCAAsC,MAAM;AAAA,MACvD,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,MAAM;AAAA,UACN,KAAK;AAAA,UACL,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MACA;AAAA,MACA,UAAU;AAAA,QACR,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,MACX;AAAA,MACA,kBAAkB;AAAA,QAChB,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA,KAAI,oBAAe,WAAf,mBAAuB,iBACvB,EAAE,cAAc,eAAe,OAAO,cAAc,IACpD,CAAC;AAAA,UACL,GAAI,eAAe,QACf;AAAA,YACE,OAAO;AAAA,cACL,UAAU,eAAe,MAAM;AAAA,cAC/B,qBACE,eAAe,MAAM;AAAA,cACvB,YAAY,eAAe,MAAM;AAAA,cACjC,MAAM,eAAe,MAAM;AAAA,YAC7B;AAAA,UACF,IACA,CAAC;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QACJ,SAC2C;AAzhB/C;AA0hBI,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AACvE,UAAM,EAAE,OAAO,YAAY,SAAS,IAAI,MAAM,KAAK,aAAa,OAAO;AAEvE,UAAM,EAAE,OAAO,gBAAgB,gBAAgB,IAAI,MAAMC,eAAc;AAAA,MACrE,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,MAC3B,SAASC;AAAA,QACP,MAAM,QAAQ,KAAK,OAAO,OAAO;AAAA,QACjC,QAAQ;AAAA,QACR;AAAA,UACE,qBAAqB;AAAA,QACvB;AAAA,MACF;AAAA,MACA,MAAM;AAAA,QACJ,OAAO,KAAK;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA,MACA,2BAA2BC;AAAA,QACzB;AAAA,MACF;AAAA,MACA,uBAAuB;AAAA,MACvB,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,UAAS,oBAAe,WAAf,mBAAuB;AACtC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,WAAW;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,mDAAmD,KAAK,UAAU,cAAc,CAAC;AAAA,MAC5F,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,WAAW,EAAE,OAAO;AAAA,MACpB;AAAA,MACA,UAAU;AAAA,QACR,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,SAC4C;AAxkBhD;AAykBI,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AACvE,UAAM,EAAE,OAAO,IAAI,QAAQ;AAE3B,UAAM,EAAE,OAAO,gBAAgB,gBAAgB,IAAI,MAAM,WAAW;AAAA,MAClE,KAAK,GAAG,KAAK,OAAO,OAAO,iBAAiB,MAAM;AAAA,MAClD,aAAa;AAAA,MACb,SAASD;AAAA,QACP,MAAM,QAAQ,KAAK,OAAO,OAAO;AAAA,QACjC,QAAQ;AAAA,MACV;AAAA,MACA,2BAA2BC;AAAA,QACzB;AAAA,MACF;AAAA,MACA,uBAAuB;AAAA,MACvB,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,cAAa,oBAAe,WAAf,mBAAuB;AAE1C,QAAI,eAAe,aAAa;AAC9B,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA,CAAC;AAAA,QACD;AAAA,MACF;AAAA,IACF;AAEA,QAAI,eAAe,YAAY,eAAe,YAAY;AACxD,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,OACE,oBAAoB,WAAW,YAAY,CAAC,cAAc,MAAM,MAAK,0BAAe,WAAf,mBAAuB,YAAvB,YAAkC,EAAE,GAAG,KAAK;AAAA,QACnH,UAAU;AAAA,UACR,WAAW;AAAA,UACX,SAAS,KAAK;AAAA,UACd,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,UAAU;AAAA,QACR,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;;;AE1nBO,IAAM,UACX,OACI,WACA;;;AbuGC,SAAS,cACd,UAAmC,CAAC,GACnB;AA9GnB;AA+GE,QAAM,WACJ,0BAAqB,QAAQ,OAAO,MAApC,YACA;AAEF,QAAM,gBACJ,0BAAqB,QAAQ,YAAY,MAAzC,YACA;AAEF,QAAM,oBACJ,0BAAqB,QAAQ,gBAAgB,MAA7C,YACA;AAEF,QAAM,aAAa,MACjB;AAAA,IACE;AAAA,MACE,eAAe,UAAU,WAAW;AAAA,QAClC,QAAQ,QAAQ;AAAA,QAChB,yBAAyB;AAAA,QACzB,aAAa;AAAA,MACf,CAAC,CAAC;AAAA,MACF,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,kBAAkB,OAAO;AAAA,EAC3B;AAEF,QAAM,sBAAsB,CAAC,YAA6B;AAxI5D,QAAAC;AAyII,eAAI,yBAAyB,SAAS;AAAA,MACpC,UAAU;AAAA,MACV;AAAA,MACA,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,eAAcA,MAAA,QAAQ,iBAAR,OAAAA,MAAwB;AAAA,IACxC,CAAC;AAAA;AAEH,QAAM,uBAAuB,CAAC,YAC5B,IAAI,sBAAsB,SAAS;AAAA,IACjC,UAAU;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,mBAAmB,CAAC,YACxB,IAAI,kBAAkB,SAAS;AAAA,IAC7B,UAAU;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,WAAW,SAAU,SAA6B;AACtD,QAAI,YAAY;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO,oBAAoB,OAAO;AAAA,EACpC;AAEA,WAAS,uBAAuB;AAChC,WAAS,gBAAgB;AACzB,WAAS,YAAY;AACrB,WAAS,YAAY;AACrB,WAAS,iBAAiB;AAC1B,WAAS,QAAQ;AACjB,WAAS,aAAa;AAEtB,WAAS,aAAa,CAAC,YAAoB;AACzC,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,aAAa,CAAC;AAAA,EACjE;AAEA,SAAO;AACT;AAEO,IAAM,UAAU,cAAc;","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.33",
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.7",
29
- "@ai-sdk/provider-utils": "5.0.28"
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 (for wan2.6 I2V/R2V models;
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 for reference-to-video mode (wan2.7 models).
31
- * Overrides the automatic mapping from `inputReferences` and `frameImages`.
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 videos are counted separately, in array order).
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: 'reference_image' | 'reference_video' | 'first_frame';
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(['reference_image', 'reference_video', 'first_frame']),
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.enum(['16:9', '9:16', '1:1', '4:3', '3:4']).nullish(),
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
- // wan2.7 models use a different protocol than earlier wan models:
100
- // resolution tiers + ratio instead of size, input.media instead of
101
- // input.reference_urls (R2V), and no shot_type or audio parameters.
102
- function isWan27Model(modelId: string): boolean {
103
- return modelId.startsWith('wan2.7');
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 wan2.7 input.media array from inputReferences and frameImages.
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
- const firstFrame = getFirstFrameImage(options);
213
- if (firstFrame != null) {
237
+ if (frames.first != null) {
214
238
  media.push({
215
239
  type: 'first_frame',
216
- url: convertImageModelFileToDataUri(firstFrame),
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 wan27 = isWan27Model(this.modelId);
302
- // wan2.7 T2V and R2V take an explicit aspect ratio (I2V follows the input image)
303
- const supportsRatio = wan27 && mode !== 'i2v';
304
-
305
- // Handle image input for I2V mode
306
- if (mode === 'i2v' && startImage != null) {
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
- // Handle references for R2V mode
311
- if (mode === 'r2v') {
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.frameImages?.find(
332
- frame => frame.frameType === 'last_frame',
333
- )?.image;
379
+ const lastFrame = getLastFrameImage(options);
334
380
 
335
- if (lastFrame != null) {
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' || wan27) {
373
- // I2V and wan2.7 models use "720P" / "1080P" format
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
- if (wan27 && resolutionTier !== '720P' && resolutionTier !== '1080P') {
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 720P and 1080P ' +
382
- `resolutions. The resolution "${options.resolution}" was ignored.`,
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 (wan27) {
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 option. ' +
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
  : {}),
@@ -13,4 +13,6 @@ export type AlibabaVideoModelId =
13
13
  | 'wan2.6-r2v-flash'
14
14
  | 'wan2.7-r2v'
15
15
  | 'wan2.7-r2v-2026-06-12'
16
+ // All-in-One (one id serves text-, image-, and reference-to-video)
17
+ | 'wan3.0-video'
16
18
  | (string & {});
@@ -56,7 +56,7 @@ export function convertAlibabaUsage(
56
56
  },
57
57
  outputTokens: {
58
58
  total: completionTokens,
59
- text: completionTokens - reasoningTokens,
59
+ text: Math.max(0, completionTokens - reasoningTokens),
60
60
  reasoning: reasoningTokens,
61
61
  },
62
62
  raw: usage,