@ai-sdk/alibaba 2.0.72 → 2.0.74

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.
@@ -9,6 +9,8 @@ import type {
9
9
  SharedV4Warning,
10
10
  } from '@ai-sdk/provider';
11
11
  import {
12
+ lazySchema,
13
+ zodSchema,
12
14
  combineHeaders,
13
15
  createEventSourceResponseHandler,
14
16
  createJsonResponseHandler,
@@ -307,11 +309,13 @@ export class AlibabaChatLanguageModel implements LanguageModelV4 {
307
309
  });
308
310
 
309
311
  // Track state across chunks
312
+ // A clean end without the provider's completion signal is interrupted.
310
313
  let finishReason: LanguageModelV4FinishReason = {
311
- unified: 'other',
314
+ unified: 'interrupted',
312
315
  raw: undefined,
313
316
  };
314
- let usage: z.infer<typeof alibabaUsageSchema> | undefined = undefined;
317
+ let usage: z.infer<ReturnType<typeof alibabaUsageSchema>> | undefined =
318
+ undefined;
315
319
 
316
320
  let isFirstChunk = true;
317
321
  let activeText = false;
@@ -322,7 +326,7 @@ export class AlibabaChatLanguageModel implements LanguageModelV4 {
322
326
  return {
323
327
  stream: response.pipeThrough(
324
328
  new TransformStream<
325
- ParseResult<z.infer<typeof alibabaChatChunkSchema>>,
329
+ ParseResult<InferSchema<typeof alibabaChatChunkSchema>>,
326
330
  LanguageModelV4StreamPart
327
331
  >({
328
332
  start(controller) {
@@ -340,6 +344,7 @@ export class AlibabaChatLanguageModel implements LanguageModelV4 {
340
344
 
341
345
  // Handle parse errors
342
346
  if (!chunk.success) {
347
+ finishReason = { unified: 'error', raw: undefined };
343
348
  controller.enqueue({ type: 'error', error: chunk.error });
344
349
  return;
345
350
  }
@@ -524,83 +529,92 @@ function resolveAlibabaThinking({
524
529
  * Reference for schemas below:
525
530
  * https://www.alibabacloud.com/help/en/model-studio/qwen-api-via-openai-chat-completions
526
531
  */
527
- const alibabaUsageSchema = z.looseObject({
528
- prompt_tokens: z.number(),
529
- completion_tokens: z.number(),
530
- total_tokens: z.number(),
531
- prompt_tokens_details: z
532
- .looseObject({
533
- cached_tokens: z.number().nullish(),
534
- cache_creation_input_tokens: z.number().nullish(),
535
- cache_type: z.string().nullish(),
536
- })
537
- .nullish(),
538
- completion_tokens_details: z
539
- .looseObject({
540
- reasoning_tokens: z.number().nullish(),
541
- })
542
- .nullish(),
543
- });
544
-
545
- const alibabaChatResponseSchema = z.object({
546
- id: z.string().nullish(),
547
- created: z.number().nullish(),
548
- model: z.string().nullish(),
549
- choices: z.array(
532
+ const alibabaUsageSchema = () =>
533
+ z.looseObject({
534
+ prompt_tokens: z.number(),
535
+ completion_tokens: z.number(),
536
+ total_tokens: z.number(),
537
+ prompt_tokens_details: z
538
+ .looseObject({
539
+ cached_tokens: z.number().nullish(),
540
+ cache_creation_input_tokens: z.number().nullish(),
541
+ cache_type: z.string().nullish(),
542
+ })
543
+ .nullish(),
544
+ completion_tokens_details: z
545
+ .looseObject({
546
+ reasoning_tokens: z.number().nullish(),
547
+ })
548
+ .nullish(),
549
+ });
550
+
551
+ const alibabaChatResponseSchema = lazySchema(() =>
552
+ zodSchema(
550
553
  z.object({
551
- message: z.object({
552
- role: z.literal('assistant').nullish(),
553
- content: z.string().nullish(),
554
- reasoning_content: z.string().nullish(), // Alibaba thinking mode
555
- tool_calls: z
556
- .array(
557
- z.object({
558
- id: z.string(),
559
- type: z.literal('function'),
560
- function: z.object({
561
- name: z.string(),
562
- arguments: z.string(),
563
- }),
564
- }),
565
- )
566
- .nullish(),
567
- }),
568
- finish_reason: z.string().nullish(),
569
- index: z.number(),
554
+ id: z.string().nullish(),
555
+ created: z.number().nullish(),
556
+ model: z.string().nullish(),
557
+ choices: z.array(
558
+ z.object({
559
+ message: z.object({
560
+ role: z.literal('assistant').nullish(),
561
+ content: z.string().nullish(),
562
+ reasoning_content: z.string().nullish(), // Alibaba thinking mode
563
+ tool_calls: z
564
+ .array(
565
+ z.object({
566
+ id: z.string(),
567
+ type: z.literal('function'),
568
+ function: z.object({
569
+ name: z.string(),
570
+ arguments: z.string(),
571
+ }),
572
+ }),
573
+ )
574
+ .nullish(),
575
+ }),
576
+ finish_reason: z.string().nullish(),
577
+ index: z.number(),
578
+ }),
579
+ ),
580
+ usage: alibabaUsageSchema().nullish(),
570
581
  }),
571
582
  ),
572
- usage: alibabaUsageSchema.nullish(),
573
- });
574
-
575
- const alibabaChatChunkSchema = z.object({
576
- id: z.string().nullish(),
577
- created: z.number().nullish(),
578
- model: z.string().nullish(),
579
- choices: z.array(
583
+ );
584
+
585
+ const alibabaChatChunkSchema = lazySchema(() =>
586
+ zodSchema(
580
587
  z.object({
581
- delta: z.object({
582
- role: z.enum(['assistant']).nullish(),
583
- content: z.string().nullish(),
584
- reasoning_content: z.string().nullish(), // Alibaba thinking mode delta
585
- tool_calls: z
586
- .array(
587
- z.object({
588
- index: z.number().nullish(), // Index for accumulating tool calls
589
- id: z.string().nullish(),
590
- type: z.literal('function').nullish(),
591
- function: z
592
- .object({
593
- name: z.string().nullish(),
594
- arguments: z.string().nullish(),
595
- })
596
- .nullish(),
597
- }),
598
- )
599
- .nullish(),
600
- }),
601
- finish_reason: z.string().nullish(),
602
- index: z.number(),
588
+ id: z.string().nullish(),
589
+ created: z.number().nullish(),
590
+ model: z.string().nullish(),
591
+ choices: z.array(
592
+ z.object({
593
+ delta: z.object({
594
+ role: z.enum(['assistant']).nullish(),
595
+ content: z.string().nullish(),
596
+ reasoning_content: z.string().nullish(), // Alibaba thinking mode delta
597
+ tool_calls: z
598
+ .array(
599
+ z.object({
600
+ index: z.number().nullish(), // Index for accumulating tool calls
601
+ id: z.string().nullish(),
602
+ type: z.literal('function').nullish(),
603
+ function: z
604
+ .object({
605
+ name: z.string().nullish(),
606
+ arguments: z.string().nullish(),
607
+ })
608
+ .nullish(),
609
+ }),
610
+ )
611
+ .nullish(),
612
+ }),
613
+ finish_reason: z.string().nullish(),
614
+ index: z.number(),
615
+ }),
616
+ ),
617
+ usage: alibabaUsageSchema().nullish(), // Usage only appears in final chunk
603
618
  }),
604
619
  ),
605
- usage: alibabaUsageSchema.nullish(), // Usage only appears in final chunk
606
- });
620
+ );
@@ -1,3 +1,8 @@
1
+ import {
2
+ lazySchema,
3
+ zodSchema,
4
+ type InferSchema,
5
+ } from '@ai-sdk/provider-utils';
1
6
  import { z } from 'zod/v4';
2
7
 
3
8
  export type AlibabaEmbeddingModelId =
@@ -5,29 +10,33 @@ export type AlibabaEmbeddingModelId =
5
10
  | 'text-embedding-v3'
6
11
  | (string & {});
7
12
 
8
- export const alibabaEmbeddingModelOptions = z.object({
9
- /**
10
- * Differentiates query text from document text for asymmetric retrieval tasks.
11
- * Defaults to `document`.
12
- */
13
- textType: z.enum(['query', 'document']).optional(),
13
+ export const alibabaEmbeddingModelOptions = lazySchema(() =>
14
+ zodSchema(
15
+ z.object({
16
+ /**
17
+ * Differentiates query text from document text for asymmetric retrieval tasks.
18
+ * Defaults to `document`.
19
+ */
20
+ textType: z.enum(['query', 'document']).optional(),
14
21
 
15
- /**
16
- * The dimension of the output embedding vectors. Defaults to 1024.
17
- *
18
- * `text-embedding-v4` also supports 1536 and 2048 dimensions.
19
- */
20
- dimension: z.number().optional(),
22
+ /**
23
+ * The dimension of the output embedding vectors. Defaults to 1024.
24
+ *
25
+ * `text-embedding-v4` also supports 1536 and 2048 dimensions.
26
+ */
27
+ dimension: z.number().optional(),
21
28
 
22
- /**
23
- * The output vector type. Defaults to `dense`.
24
- *
25
- * Sparse-only output is not supported by the AI SDK embedding interface,
26
- * which requires dense number arrays.
27
- */
28
- outputType: z.enum(['dense', 'sparse', 'dense&sparse']).optional(),
29
- });
29
+ /**
30
+ * The output vector type. Defaults to `dense`.
31
+ *
32
+ * Sparse-only output is not supported by the AI SDK embedding interface,
33
+ * which requires dense number arrays.
34
+ */
35
+ outputType: z.enum(['dense', 'sparse', 'dense&sparse']).optional(),
36
+ }),
37
+ ),
38
+ );
30
39
 
31
- export type AlibabaEmbeddingModelOptions = z.infer<
40
+ export type AlibabaEmbeddingModelOptions = InferSchema<
32
41
  typeof alibabaEmbeddingModelOptions
33
42
  >;
@@ -4,6 +4,8 @@ import {
4
4
  type EmbeddingModelV4,
5
5
  } from '@ai-sdk/provider';
6
6
  import {
7
+ lazySchema,
8
+ zodSchema,
7
9
  combineHeaders,
8
10
  createJsonErrorResponseHandler,
9
11
  createJsonResponseHandler,
@@ -153,27 +155,32 @@ export class AlibabaEmbeddingModel implements EmbeddingModelV4 {
153
155
  }
154
156
  }
155
157
 
156
- const alibabaTextEmbeddingSparseEmbeddingSchema = z.object({
157
- index: z.number(),
158
- value: z.number(),
159
- token: z.string().nullish(),
160
- });
158
+ const alibabaTextEmbeddingSparseEmbeddingSchema = () =>
159
+ z.object({
160
+ index: z.number(),
161
+ value: z.number(),
162
+ token: z.string().nullish(),
163
+ });
161
164
 
162
- const alibabaTextEmbeddingResponseSchema = z.object({
163
- output: z.object({
164
- embeddings: z.array(
165
- z.object({
166
- embedding: z.array(z.number()),
167
- text_index: z.number(),
168
- sparse_embedding: z
169
- .array(alibabaTextEmbeddingSparseEmbeddingSchema)
170
- .nullish(),
165
+ const alibabaTextEmbeddingResponseSchema = lazySchema(() =>
166
+ zodSchema(
167
+ z.object({
168
+ output: z.object({
169
+ embeddings: z.array(
170
+ z.object({
171
+ embedding: z.array(z.number()),
172
+ text_index: z.number(),
173
+ sparse_embedding: z
174
+ .array(alibabaTextEmbeddingSparseEmbeddingSchema())
175
+ .nullish(),
176
+ }),
177
+ ),
171
178
  }),
172
- ),
173
- }),
174
- usage: z
175
- .object({
176
- total_tokens: z.number(),
177
- })
178
- .nullish(),
179
- });
179
+ usage: z
180
+ .object({
181
+ total_tokens: z.number(),
182
+ })
183
+ .nullish(),
184
+ }),
185
+ ),
186
+ );
@@ -1,15 +1,24 @@
1
- import { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';
1
+ import {
2
+ lazySchema,
3
+ zodSchema,
4
+ type InferSchema,
5
+ createJsonErrorResponseHandler,
6
+ } from '@ai-sdk/provider-utils';
2
7
  import { z } from 'zod/v4';
3
8
 
4
- const alibabaErrorDataSchema = z.object({
5
- error: z.object({
6
- message: z.string(),
7
- code: z.string().nullish(),
8
- type: z.string().nullish(),
9
- }),
10
- });
9
+ const alibabaErrorDataSchema = lazySchema(() =>
10
+ zodSchema(
11
+ z.object({
12
+ error: z.object({
13
+ message: z.string(),
14
+ code: z.string().nullish(),
15
+ type: z.string().nullish(),
16
+ }),
17
+ }),
18
+ ),
19
+ );
11
20
 
12
- export type AlibabaErrorData = z.infer<typeof alibabaErrorDataSchema>;
21
+ export type AlibabaErrorData = InferSchema<typeof alibabaErrorDataSchema>;
13
22
 
14
23
  export const alibabaFailedResponseHandler = createJsonErrorResponseHandler({
15
24
  errorSchema: alibabaErrorDataSchema,
@@ -9,11 +9,15 @@ import {
9
9
  type SharedV4Warning,
10
10
  } from '@ai-sdk/provider';
11
11
  import {
12
+ lazySchema,
13
+ zodSchema,
14
+ type InferSchema,
12
15
  combineHeaders,
13
16
  convertImageModelFileToDataUri,
14
17
  convertUint8ArrayToBase64,
15
18
  createJsonErrorResponseHandler,
16
19
  createJsonResponseHandler,
20
+ encodePathSegment,
17
21
  getFromApi,
18
22
  parseProviderOptions,
19
23
  postJsonToApi,
@@ -39,58 +43,70 @@ interface AlibabaVideoModelConfig {
39
43
  }
40
44
 
41
45
  // DashScope native API error format (different from OpenAI-compatible endpoint)
42
- const alibabaVideoErrorSchema = z.object({
43
- code: z.string().nullish(),
44
- message: z.string(),
45
- request_id: z.string().nullish(),
46
- });
46
+ const alibabaVideoErrorSchema = lazySchema(() =>
47
+ zodSchema(
48
+ z.object({
49
+ code: z.string().nullish(),
50
+ message: z.string(),
51
+ request_id: z.string().nullish(),
52
+ }),
53
+ ),
54
+ );
47
55
 
48
56
  const alibabaVideoFailedResponseHandler = createJsonErrorResponseHandler({
49
57
  errorSchema: alibabaVideoErrorSchema,
50
58
  errorToMessage: data => data.message,
51
59
  });
52
60
 
53
- const alibabaVideoCreateTaskSchema = z.object({
54
- output: z
55
- .object({
56
- task_status: z.string(),
57
- task_id: z.string(),
58
- })
59
- .nullish(),
60
- request_id: z.string().nullish(),
61
- });
62
-
63
- const alibabaVideoTaskStatusSchema = z.object({
64
- output: z
65
- .object({
66
- task_id: z.string(),
67
- task_status: z.string(),
68
- video_url: z.string().nullish(),
69
- submit_time: z.string().nullish(),
70
- scheduled_time: z.string().nullish(),
71
- end_time: z.string().nullish(),
72
- orig_prompt: z.string().nullish(),
73
- actual_prompt: z.string().nullish(),
74
- code: z.string().nullish(),
75
- message: z.string().nullish(),
76
- })
77
- .nullish(),
78
- usage: z
79
- .object({
80
- duration: z.number().nullish(),
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(),
85
- SR: z.number().nullish(),
86
- size: z.string().nullish(),
87
- ratio: z.string().nullish(),
88
- })
89
- .nullish(),
90
- request_id: z.string().nullish(),
91
- });
92
-
93
- type AlibabaVideoTaskStatusResponse = z.infer<
61
+ const alibabaVideoCreateTaskSchema = lazySchema(() =>
62
+ zodSchema(
63
+ z.object({
64
+ output: z
65
+ .object({
66
+ task_status: z.string(),
67
+ task_id: z.string(),
68
+ })
69
+ .nullish(),
70
+ request_id: z.string().nullish(),
71
+ }),
72
+ ),
73
+ );
74
+
75
+ const alibabaVideoTaskStatusSchema = lazySchema(() =>
76
+ zodSchema(
77
+ z.object({
78
+ output: z
79
+ .object({
80
+ task_id: z.string(),
81
+ task_status: z.string(),
82
+ video_url: z.string().nullish(),
83
+ submit_time: z.string().nullish(),
84
+ scheduled_time: z.string().nullish(),
85
+ end_time: z.string().nullish(),
86
+ orig_prompt: z.string().nullish(),
87
+ actual_prompt: z.string().nullish(),
88
+ code: z.string().nullish(),
89
+ message: z.string().nullish(),
90
+ })
91
+ .nullish(),
92
+ usage: z
93
+ .object({
94
+ duration: z.number().nullish(),
95
+ output_video_duration: z.number().nullish(),
96
+ // wan3 splits the total: input video counts toward its 30s ceiling.
97
+ input_video_duration: z.number().nullish(),
98
+ fps: z.number().nullish(),
99
+ SR: z.number().nullish(),
100
+ size: z.string().nullish(),
101
+ ratio: z.string().nullish(),
102
+ })
103
+ .nullish(),
104
+ request_id: z.string().nullish(),
105
+ }),
106
+ ),
107
+ );
108
+
109
+ type AlibabaVideoTaskStatusResponse = InferSchema<
94
110
  typeof alibabaVideoTaskStatusSchema
95
111
  >;
96
112
 
@@ -662,7 +678,7 @@ export class AlibabaVideoModel implements VideoModelV4 {
662
678
  const { taskId } = options.operation as { taskId: string };
663
679
 
664
680
  const { value: statusResponse, responseHeaders } = await getFromApi({
665
- url: `${this.config.baseURL}/api/v1/tasks/${taskId}`,
681
+ url: `${this.config.baseURL}/api/v1/tasks/${encodePathSegment(taskId)}`,
666
682
  validateUrl: false,
667
683
  headers: combineHeaders(
668
684
  await resolve(this.config.headers),