@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.
- package/CHANGELOG.md +26 -0
- package/dist/index.d.ts +14 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -27
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/alibaba-chat-language-model-options.ts +38 -29
- package/src/alibaba-chat-language-model.ts +91 -77
- package/src/alibaba-embedding-model-options.ts +30 -21
- package/src/alibaba-embedding-model.ts +29 -22
- package/src/alibaba-error.ts +18 -9
- package/src/alibaba-video-model.ts +63 -47
|
@@ -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: '
|
|
314
|
+
unified: 'interrupted',
|
|
312
315
|
raw: undefined,
|
|
313
316
|
};
|
|
314
|
-
let usage: z.infer<typeof alibabaUsageSchema
|
|
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<
|
|
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 =
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
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
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
.
|
|
557
|
-
z.
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
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
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
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
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
.
|
|
587
|
-
z.
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
.object({
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
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
|
-
|
|
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 =
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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 =
|
|
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 =
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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 =
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
z.object({
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
})
|
|
178
|
-
|
|
179
|
-
|
|
179
|
+
usage: z
|
|
180
|
+
.object({
|
|
181
|
+
total_tokens: z.number(),
|
|
182
|
+
})
|
|
183
|
+
.nullish(),
|
|
184
|
+
}),
|
|
185
|
+
),
|
|
186
|
+
);
|
package/src/alibaba-error.ts
CHANGED
|
@@ -1,15 +1,24 @@
|
|
|
1
|
-
import {
|
|
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 =
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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 =
|
|
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 =
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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 =
|
|
54
|
-
|
|
55
|
-
.object({
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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),
|