@ai-sdk/zai 1.0.1 → 2.0.1
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 +7 -9
- package/dist/index.d.ts +10 -6
- package/dist/index.js +54 -115
- package/dist/index.js.map +1 -1
- package/package.json +7 -8
- package/src/zai-chat-language-model.ts +31 -76
- package/src/zai-provider.ts +16 -10
- package/dist/index.d.mts +0 -88
- package/dist/index.mjs +0 -290
- package/dist/index.mjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
# @ai-sdk/zai
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 2.0.1
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
7
|
-
- Updated dependencies [
|
|
8
|
-
- @ai-sdk/provider-utils@
|
|
9
|
-
- @ai-sdk/openai-compatible@
|
|
7
|
+
- Updated dependencies [9a521b9]
|
|
8
|
+
- @ai-sdk/provider-utils@4.0.49
|
|
9
|
+
- @ai-sdk/openai-compatible@2.0.73
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## 2.0.0
|
|
12
12
|
|
|
13
13
|
### Major Changes
|
|
14
14
|
|
|
15
|
-
-
|
|
15
|
+
- 5604dde: feat(zai): add the Z.AI provider with GLM chat completions, streaming, reasoning, tools, and multimodal inputs
|
|
16
16
|
|
|
17
17
|
### Patch Changes
|
|
18
18
|
|
|
19
|
-
-
|
|
20
|
-
- Updated dependencies [e264a35]
|
|
21
|
-
- @ai-sdk/openai-compatible@1.0.51
|
|
19
|
+
- ad28ecb: Backport: Add GLM-5.3-Flash model support to the Z.AI provider and AI Gateway.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod/v4';
|
|
2
|
-
import {
|
|
2
|
+
import { ProviderV3, LanguageModelV3 } from '@ai-sdk/provider';
|
|
3
3
|
import { FetchFunction } from '@ai-sdk/provider-utils';
|
|
4
4
|
|
|
5
5
|
declare const zaiLanguageModelChatOptions: z.ZodObject<{
|
|
@@ -62,23 +62,27 @@ interface ZaiProviderSettings {
|
|
|
62
62
|
*/
|
|
63
63
|
fetch?: FetchFunction;
|
|
64
64
|
}
|
|
65
|
-
interface ZaiProvider extends
|
|
65
|
+
interface ZaiProvider extends ProviderV3 {
|
|
66
66
|
/**
|
|
67
67
|
* Creates a Z.AI chat model for text generation.
|
|
68
68
|
*/
|
|
69
|
-
(modelId: ZaiChatModelId):
|
|
69
|
+
(modelId: ZaiChatModelId): LanguageModelV3;
|
|
70
70
|
/**
|
|
71
71
|
* Creates a Z.AI language model.
|
|
72
72
|
*/
|
|
73
|
-
languageModel(modelId: ZaiChatModelId):
|
|
73
|
+
languageModel(modelId: ZaiChatModelId): LanguageModelV3;
|
|
74
74
|
/**
|
|
75
75
|
* Creates a Z.AI chat model.
|
|
76
76
|
*/
|
|
77
|
-
chatModel(modelId: ZaiChatModelId):
|
|
77
|
+
chatModel(modelId: ZaiChatModelId): LanguageModelV3;
|
|
78
78
|
/**
|
|
79
79
|
* Creates a Z.AI chat model.
|
|
80
80
|
*/
|
|
81
|
-
chat(modelId: ZaiChatModelId):
|
|
81
|
+
chat(modelId: ZaiChatModelId): LanguageModelV3;
|
|
82
|
+
/**
|
|
83
|
+
* @deprecated Use `embeddingModel` instead.
|
|
84
|
+
*/
|
|
85
|
+
textEmbeddingModel(modelId: string): never;
|
|
82
86
|
}
|
|
83
87
|
declare function createZai(options?: ZaiProviderSettings): ZaiProvider;
|
|
84
88
|
declare const zai: ZaiProvider;
|
package/dist/index.js
CHANGED
|
@@ -1,84 +1,64 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/index.ts
|
|
21
|
-
var index_exports = {};
|
|
22
|
-
__export(index_exports, {
|
|
23
|
-
VERSION: () => VERSION,
|
|
24
|
-
createZai: () => createZai,
|
|
25
|
-
zai: () => zai
|
|
26
|
-
});
|
|
27
|
-
module.exports = __toCommonJS(index_exports);
|
|
28
|
-
|
|
29
1
|
// src/zai-provider.ts
|
|
30
|
-
|
|
31
|
-
|
|
2
|
+
import {
|
|
3
|
+
NoSuchModelError
|
|
4
|
+
} from "@ai-sdk/provider";
|
|
5
|
+
import {
|
|
6
|
+
loadApiKey,
|
|
7
|
+
withoutTrailingSlash,
|
|
8
|
+
withUserAgentSuffix
|
|
9
|
+
} from "@ai-sdk/provider-utils";
|
|
32
10
|
|
|
33
11
|
// src/version.ts
|
|
34
|
-
var VERSION = true ? "
|
|
12
|
+
var VERSION = true ? "2.0.1" : "0.0.0-test";
|
|
35
13
|
|
|
36
14
|
// src/zai-chat-language-model.ts
|
|
37
|
-
|
|
38
|
-
|
|
15
|
+
import { OpenAICompatibleChatLanguageModel } from "@ai-sdk/openai-compatible";
|
|
16
|
+
import {
|
|
17
|
+
parseProviderOptions
|
|
18
|
+
} from "@ai-sdk/provider-utils";
|
|
39
19
|
|
|
40
20
|
// src/zai-chat-language-model-options.ts
|
|
41
|
-
|
|
42
|
-
var zaiLanguageModelChatOptions =
|
|
21
|
+
import { z } from "zod/v4";
|
|
22
|
+
var zaiLanguageModelChatOptions = z.object({
|
|
43
23
|
/**
|
|
44
24
|
* Enables or disables sampling. When disabled, temperature and topP do not
|
|
45
25
|
* take effect.
|
|
46
26
|
*/
|
|
47
|
-
doSample:
|
|
27
|
+
doSample: z.boolean().optional(),
|
|
48
28
|
/**
|
|
49
29
|
* Controls model thinking and whether reasoning from earlier turns is kept.
|
|
50
30
|
*/
|
|
51
|
-
thinking:
|
|
52
|
-
type:
|
|
53
|
-
clearThinking:
|
|
31
|
+
thinking: z.object({
|
|
32
|
+
type: z.enum(["enabled", "disabled"]).optional(),
|
|
33
|
+
clearThinking: z.boolean().optional()
|
|
54
34
|
}).optional(),
|
|
55
35
|
/**
|
|
56
36
|
* Controls reasoning effort for GLM-5.2 and later models.
|
|
57
37
|
*/
|
|
58
|
-
reasoningEffort:
|
|
38
|
+
reasoningEffort: z.enum(["none", "minimal", "low", "medium", "high", "xhigh", "max"]).optional(),
|
|
59
39
|
/**
|
|
60
40
|
* Enables incremental function-call argument streaming on supported models.
|
|
61
41
|
*/
|
|
62
|
-
toolStream:
|
|
42
|
+
toolStream: z.boolean().optional(),
|
|
63
43
|
/**
|
|
64
44
|
* A caller-provided request identifier between 6 and 64 characters.
|
|
65
45
|
*/
|
|
66
|
-
requestId:
|
|
46
|
+
requestId: z.string().min(6).max(64).optional(),
|
|
67
47
|
/**
|
|
68
48
|
* A non-sensitive end-user identifier between 6 and 128 characters.
|
|
69
49
|
*/
|
|
70
|
-
userId:
|
|
50
|
+
userId: z.string().min(6).max(128).optional()
|
|
71
51
|
});
|
|
72
52
|
|
|
73
53
|
// src/zai-error.ts
|
|
74
|
-
|
|
75
|
-
var zaiErrorDetailsSchema =
|
|
76
|
-
code:
|
|
77
|
-
message:
|
|
54
|
+
import { z as z2 } from "zod/v4";
|
|
55
|
+
var zaiErrorDetailsSchema = z2.object({
|
|
56
|
+
code: z2.union([z2.number(), z2.string()]).nullish(),
|
|
57
|
+
message: z2.string()
|
|
78
58
|
});
|
|
79
|
-
var zaiErrorSchema =
|
|
59
|
+
var zaiErrorSchema = z2.union([
|
|
80
60
|
zaiErrorDetailsSchema,
|
|
81
|
-
|
|
61
|
+
z2.object({ error: zaiErrorDetailsSchema })
|
|
82
62
|
]);
|
|
83
63
|
var zaiErrorStructure = {
|
|
84
64
|
errorSchema: zaiErrorSchema,
|
|
@@ -116,34 +96,19 @@ function transformZaiRequestBody(args) {
|
|
|
116
96
|
...userId !== void 0 && { user_id: userId }
|
|
117
97
|
};
|
|
118
98
|
}
|
|
119
|
-
function mapZaiFinishReason(finishReason
|
|
120
|
-
switch (
|
|
99
|
+
function mapZaiFinishReason(finishReason) {
|
|
100
|
+
switch (finishReason.raw) {
|
|
121
101
|
case "sensitive":
|
|
122
|
-
return "content-filter";
|
|
102
|
+
return { unified: "content-filter", raw: finishReason.raw };
|
|
123
103
|
case "model_context_window_exceeded":
|
|
124
|
-
return "length";
|
|
104
|
+
return { unified: "length", raw: finishReason.raw };
|
|
125
105
|
case "network_error":
|
|
126
|
-
return "error";
|
|
106
|
+
return { unified: "error", raw: finishReason.raw };
|
|
127
107
|
default:
|
|
128
108
|
return finishReason;
|
|
129
109
|
}
|
|
130
110
|
}
|
|
131
|
-
|
|
132
|
-
if (responseBody == null || typeof responseBody !== "object") {
|
|
133
|
-
return void 0;
|
|
134
|
-
}
|
|
135
|
-
const choices = responseBody.choices;
|
|
136
|
-
if (!Array.isArray(choices) || choices.length === 0) {
|
|
137
|
-
return void 0;
|
|
138
|
-
}
|
|
139
|
-
const choice = choices[0];
|
|
140
|
-
if (choice == null || typeof choice !== "object") {
|
|
141
|
-
return void 0;
|
|
142
|
-
}
|
|
143
|
-
const finishReason = choice.finish_reason;
|
|
144
|
-
return typeof finishReason === "string" ? finishReason : void 0;
|
|
145
|
-
}
|
|
146
|
-
var ZaiChatLanguageModel = class extends import_openai_compatible.OpenAICompatibleChatLanguageModel {
|
|
111
|
+
var ZaiChatLanguageModel = class extends OpenAICompatibleChatLanguageModel {
|
|
147
112
|
constructor(modelId, config) {
|
|
148
113
|
const headers = config.headers;
|
|
149
114
|
super(modelId, {
|
|
@@ -161,25 +126,19 @@ var ZaiChatLanguageModel = class extends import_openai_compatible.OpenAICompatib
|
|
|
161
126
|
}
|
|
162
127
|
async prepareCallOptions(options) {
|
|
163
128
|
const warnings = [];
|
|
164
|
-
const zaiOptions = await
|
|
129
|
+
const zaiOptions = await parseProviderOptions({
|
|
165
130
|
provider: "zai",
|
|
166
131
|
providerOptions: options.providerOptions,
|
|
167
132
|
schema: zaiLanguageModelChatOptions
|
|
168
133
|
});
|
|
169
134
|
if (options.frequencyPenalty != null) {
|
|
170
|
-
warnings.push({
|
|
171
|
-
type: "unsupported-setting",
|
|
172
|
-
setting: "frequencyPenalty"
|
|
173
|
-
});
|
|
135
|
+
warnings.push({ type: "unsupported", feature: "frequencyPenalty" });
|
|
174
136
|
}
|
|
175
137
|
if (options.presencePenalty != null) {
|
|
176
|
-
warnings.push({
|
|
177
|
-
type: "unsupported-setting",
|
|
178
|
-
setting: "presencePenalty"
|
|
179
|
-
});
|
|
138
|
+
warnings.push({ type: "unsupported", feature: "presencePenalty" });
|
|
180
139
|
}
|
|
181
140
|
if (options.seed != null) {
|
|
182
|
-
warnings.push({ type: "unsupported
|
|
141
|
+
warnings.push({ type: "unsupported", feature: "seed" });
|
|
183
142
|
}
|
|
184
143
|
let tools = options.tools;
|
|
185
144
|
let toolChoice = options.toolChoice;
|
|
@@ -188,8 +147,8 @@ var ZaiChatLanguageModel = class extends import_openai_compatible.OpenAICompatib
|
|
|
188
147
|
toolChoice = void 0;
|
|
189
148
|
} else if (toolChoice != null && toolChoice.type !== "auto") {
|
|
190
149
|
warnings.push({
|
|
191
|
-
type: "unsupported
|
|
192
|
-
|
|
150
|
+
type: "unsupported",
|
|
151
|
+
feature: `toolChoice ${toolChoice.type}`,
|
|
193
152
|
details: "Z.AI currently supports only automatic tool selection."
|
|
194
153
|
});
|
|
195
154
|
toolChoice = void 0;
|
|
@@ -209,32 +168,22 @@ var ZaiChatLanguageModel = class extends import_openai_compatible.OpenAICompatib
|
|
|
209
168
|
return { normalizedOptions, warnings };
|
|
210
169
|
}
|
|
211
170
|
async doGenerate(options) {
|
|
212
|
-
var _a;
|
|
213
171
|
const { normalizedOptions, warnings } = await this.prepareCallOptions(options);
|
|
214
172
|
const result = await super.doGenerate(normalizedOptions);
|
|
215
173
|
return {
|
|
216
174
|
...result,
|
|
217
|
-
finishReason: mapZaiFinishReason(
|
|
218
|
-
result.finishReason,
|
|
219
|
-
getRawFinishReason((_a = result.response) == null ? void 0 : _a.body)
|
|
220
|
-
),
|
|
175
|
+
finishReason: mapZaiFinishReason(result.finishReason),
|
|
221
176
|
warnings: [...result.warnings, ...warnings]
|
|
222
177
|
};
|
|
223
178
|
}
|
|
224
179
|
async doStream(options) {
|
|
225
|
-
const originalIncludeRawChunks = options.includeRawChunks;
|
|
226
180
|
const { normalizedOptions, warnings } = await this.prepareCallOptions(options);
|
|
227
|
-
const result = await super.doStream(
|
|
228
|
-
...normalizedOptions,
|
|
229
|
-
includeRawChunks: true
|
|
230
|
-
});
|
|
231
|
-
let rawFinishReason;
|
|
181
|
+
const result = await super.doStream(normalizedOptions);
|
|
232
182
|
return {
|
|
233
183
|
...result,
|
|
234
184
|
stream: result.stream.pipeThrough(
|
|
235
185
|
new TransformStream({
|
|
236
186
|
transform(part, controller) {
|
|
237
|
-
var _a;
|
|
238
187
|
if (part.type === "stream-start") {
|
|
239
188
|
controller.enqueue({
|
|
240
189
|
...part,
|
|
@@ -242,20 +191,10 @@ var ZaiChatLanguageModel = class extends import_openai_compatible.OpenAICompatib
|
|
|
242
191
|
});
|
|
243
192
|
return;
|
|
244
193
|
}
|
|
245
|
-
if (part.type === "raw") {
|
|
246
|
-
rawFinishReason = (_a = getRawFinishReason(part.rawValue)) != null ? _a : rawFinishReason;
|
|
247
|
-
if (originalIncludeRawChunks) {
|
|
248
|
-
controller.enqueue(part);
|
|
249
|
-
}
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
194
|
if (part.type === "finish") {
|
|
253
195
|
controller.enqueue({
|
|
254
196
|
...part,
|
|
255
|
-
finishReason: mapZaiFinishReason(
|
|
256
|
-
part.finishReason,
|
|
257
|
-
rawFinishReason
|
|
258
|
-
)
|
|
197
|
+
finishReason: mapZaiFinishReason(part.finishReason)
|
|
259
198
|
});
|
|
260
199
|
return;
|
|
261
200
|
}
|
|
@@ -270,10 +209,10 @@ var ZaiChatLanguageModel = class extends import_openai_compatible.OpenAICompatib
|
|
|
270
209
|
// src/zai-provider.ts
|
|
271
210
|
function createZai(options = {}) {
|
|
272
211
|
var _a;
|
|
273
|
-
const baseURL = (_a =
|
|
274
|
-
const getHeaders = () =>
|
|
212
|
+
const baseURL = (_a = withoutTrailingSlash(options.baseURL)) != null ? _a : "https://api.z.ai/api/paas/v4";
|
|
213
|
+
const getHeaders = () => withUserAgentSuffix(
|
|
275
214
|
{
|
|
276
|
-
Authorization: `Bearer ${
|
|
215
|
+
Authorization: `Bearer ${loadApiKey({
|
|
277
216
|
apiKey: options.apiKey,
|
|
278
217
|
environmentVariableName: "ZAI_API_KEY",
|
|
279
218
|
description: "Z.AI API key"
|
|
@@ -289,23 +228,23 @@ function createZai(options = {}) {
|
|
|
289
228
|
fetch: options.fetch
|
|
290
229
|
});
|
|
291
230
|
const provider = (modelId) => createLanguageModel(modelId);
|
|
292
|
-
provider.specificationVersion = "
|
|
231
|
+
provider.specificationVersion = "v3";
|
|
293
232
|
provider.languageModel = createLanguageModel;
|
|
294
233
|
provider.chatModel = createLanguageModel;
|
|
295
234
|
provider.chat = createLanguageModel;
|
|
296
|
-
provider.
|
|
297
|
-
throw new
|
|
235
|
+
provider.embeddingModel = (modelId) => {
|
|
236
|
+
throw new NoSuchModelError({ modelId, modelType: "embeddingModel" });
|
|
298
237
|
};
|
|
238
|
+
provider.textEmbeddingModel = provider.embeddingModel;
|
|
299
239
|
provider.imageModel = (modelId) => {
|
|
300
|
-
throw new
|
|
240
|
+
throw new NoSuchModelError({ modelId, modelType: "imageModel" });
|
|
301
241
|
};
|
|
302
242
|
return provider;
|
|
303
243
|
}
|
|
304
244
|
var zai = createZai();
|
|
305
|
-
|
|
306
|
-
0 && (module.exports = {
|
|
245
|
+
export {
|
|
307
246
|
VERSION,
|
|
308
247
|
createZai,
|
|
309
248
|
zai
|
|
310
|
-
}
|
|
249
|
+
};
|
|
311
250
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/zai-provider.ts","../src/version.ts","../src/zai-chat-language-model.ts","../src/zai-chat-language-model-options.ts","../src/zai-error.ts"],"sourcesContent":["export type { ZaiLanguageModelChatOptions } from './zai-chat-language-model-options';\nexport type { ZaiChatModelId } from './zai-chat-options';\nexport type { ZaiErrorData } from './zai-error';\nexport { createZai, zai } from './zai-provider';\nexport type { ZaiProvider, ZaiProviderSettings } from './zai-provider';\nexport { VERSION } from './version';\n","import {\n NoSuchModelError,\n type LanguageModelV2,\n type ProviderV2,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { VERSION } from './version';\nimport { ZaiChatLanguageModel } from './zai-chat-language-model';\nimport type { ZaiChatModelId } from './zai-chat-options';\n\nexport interface ZaiProviderSettings {\n /**\n * Z.AI API key. Defaults to the `ZAI_API_KEY` environment variable.\n */\n apiKey?: string;\n\n /**\n * Base URL for API calls. Defaults to\n * `https://api.z.ai/api/paas/v4`.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation.\n */\n fetch?: FetchFunction;\n}\n\nexport interface ZaiProvider extends ProviderV2 {\n /**\n * Creates a Z.AI chat model for text generation.\n */\n (modelId: ZaiChatModelId): LanguageModelV2;\n\n /**\n * Creates a Z.AI language model.\n */\n languageModel(modelId: ZaiChatModelId): LanguageModelV2;\n\n /**\n * Creates a Z.AI chat model.\n */\n chatModel(modelId: ZaiChatModelId): LanguageModelV2;\n\n /**\n * Creates a Z.AI chat model.\n */\n chat(modelId: ZaiChatModelId): LanguageModelV2;\n}\n\nexport function createZai(options: ZaiProviderSettings = {}): ZaiProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ?? 'https://api.z.ai/api/paas/v4';\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'ZAI_API_KEY',\n description: 'Z.AI API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk/zai/${VERSION}`,\n );\n\n const createLanguageModel = (modelId: ZaiChatModelId) =>\n new ZaiChatLanguageModel(modelId, {\n provider: 'zai.chat',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = (modelId: ZaiChatModelId) => createLanguageModel(modelId);\n\n provider.specificationVersion = 'v2' as const;\n provider.languageModel = createLanguageModel;\n provider.chatModel = createLanguageModel;\n provider.chat = createLanguageModel;\n\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n\nexport const zai = createZai();\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","import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2CallWarning,\n LanguageModelV2FinishReason,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider';\nimport {\n parseProviderOptions,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport type { ZaiChatModelId } from './zai-chat-options';\nimport { zaiLanguageModelChatOptions } from './zai-chat-language-model-options';\nimport { zaiErrorStructure } from './zai-error';\n\nexport type ZaiChatConfig = {\n provider: string;\n baseURL: string;\n headers?:\n | Record<string, string | undefined>\n | (() => Record<string, string | undefined>);\n fetch?: FetchFunction;\n};\n\nfunction transformZaiRequestBody(\n args: Record<string, any>,\n): Record<string, any> {\n const {\n doSample,\n frequency_penalty: _frequencyPenalty,\n presence_penalty: _presencePenalty,\n requestId,\n seed: _seed,\n thinking,\n toolStream,\n user: _user,\n userId,\n verbosity: _verbosity,\n ...restArgs\n } = args;\n\n return {\n ...restArgs,\n ...(doSample !== undefined && { do_sample: doSample }),\n ...(thinking !== undefined && {\n thinking: {\n ...(thinking.type !== undefined && { type: thinking.type }),\n ...(thinking.clearThinking !== undefined && {\n clear_thinking: thinking.clearThinking,\n }),\n },\n }),\n ...(toolStream !== undefined && { tool_stream: toolStream }),\n ...(requestId !== undefined && { request_id: requestId }),\n ...(userId !== undefined && { user_id: userId }),\n };\n}\n\nfunction mapZaiFinishReason(\n finishReason: LanguageModelV2FinishReason,\n rawFinishReason: string | undefined,\n): LanguageModelV2FinishReason {\n switch (rawFinishReason) {\n case 'sensitive':\n return 'content-filter';\n case 'model_context_window_exceeded':\n return 'length';\n case 'network_error':\n return 'error';\n default:\n return finishReason;\n }\n}\n\nfunction getRawFinishReason(responseBody: unknown): string | undefined {\n if (responseBody == null || typeof responseBody !== 'object') {\n return undefined;\n }\n\n const choices = (responseBody as { choices?: unknown }).choices;\n if (!Array.isArray(choices) || choices.length === 0) {\n return undefined;\n }\n\n const choice = choices[0];\n if (choice == null || typeof choice !== 'object') {\n return undefined;\n }\n\n const finishReason = (choice as { finish_reason?: unknown }).finish_reason;\n return typeof finishReason === 'string' ? finishReason : undefined;\n}\n\nexport class ZaiChatLanguageModel\n extends OpenAICompatibleChatLanguageModel\n implements LanguageModelV2\n{\n constructor(modelId: ZaiChatModelId, config: ZaiChatConfig) {\n const headers = config.headers;\n\n super(modelId, {\n provider: config.provider,\n url: ({ path }) => `${config.baseURL}${path}`,\n headers: () =>\n headers == null\n ? {}\n : typeof headers === 'function'\n ? headers()\n : headers,\n fetch: config.fetch,\n errorStructure: zaiErrorStructure,\n transformRequestBody: transformZaiRequestBody,\n supportedUrls: () => ({\n 'image/*': [/^https?:\\/\\//],\n 'video/*': [/^https?:\\/\\//],\n }),\n });\n }\n\n private async prepareCallOptions(options: LanguageModelV2CallOptions) {\n const warnings: LanguageModelV2CallWarning[] = [];\n\n const zaiOptions = await parseProviderOptions({\n provider: 'zai',\n providerOptions: options.providerOptions,\n schema: zaiLanguageModelChatOptions,\n });\n\n if (options.frequencyPenalty != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'frequencyPenalty',\n });\n }\n if (options.presencePenalty != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'presencePenalty',\n });\n }\n if (options.seed != null) {\n warnings.push({ type: 'unsupported-setting', setting: 'seed' });\n }\n\n let tools = options.tools;\n let toolChoice = options.toolChoice;\n\n if (toolChoice?.type === 'none') {\n tools = undefined;\n toolChoice = undefined;\n } else if (toolChoice != null && toolChoice.type !== 'auto') {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'toolChoice',\n details: 'Z.AI currently supports only automatic tool selection.',\n });\n toolChoice = undefined;\n }\n\n const normalizedOptions: LanguageModelV2CallOptions = {\n ...options,\n frequencyPenalty: undefined,\n presencePenalty: undefined,\n seed: undefined,\n tools,\n toolChoice,\n providerOptions:\n zaiOptions == null\n ? options.providerOptions\n : {\n ...options.providerOptions,\n zai: zaiOptions,\n },\n };\n\n return { normalizedOptions, warnings };\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const { normalizedOptions, warnings } =\n await this.prepareCallOptions(options);\n const result = await super.doGenerate(normalizedOptions);\n\n return {\n ...result,\n finishReason: mapZaiFinishReason(\n result.finishReason,\n getRawFinishReason(result.response?.body),\n ),\n warnings: [...result.warnings, ...warnings],\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const originalIncludeRawChunks = options.includeRawChunks;\n const { normalizedOptions, warnings } =\n await this.prepareCallOptions(options);\n const result = await super.doStream({\n ...normalizedOptions,\n includeRawChunks: true,\n });\n\n let rawFinishReason: string | undefined;\n\n return {\n ...result,\n stream: result.stream.pipeThrough(\n new TransformStream<\n LanguageModelV2StreamPart,\n LanguageModelV2StreamPart\n >({\n transform(part, controller) {\n if (part.type === 'stream-start') {\n controller.enqueue({\n ...part,\n warnings: [...part.warnings, ...warnings],\n });\n return;\n }\n\n if (part.type === 'raw') {\n rawFinishReason =\n getRawFinishReason(part.rawValue) ?? rawFinishReason;\n if (originalIncludeRawChunks) {\n controller.enqueue(part);\n }\n return;\n }\n\n if (part.type === 'finish') {\n controller.enqueue({\n ...part,\n finishReason: mapZaiFinishReason(\n part.finishReason,\n rawFinishReason,\n ),\n });\n return;\n }\n\n controller.enqueue(part);\n },\n }),\n ),\n };\n }\n}\n","import { z } from 'zod/v4';\n\nexport const zaiLanguageModelChatOptions = z.object({\n /**\n * Enables or disables sampling. When disabled, temperature and topP do not\n * take effect.\n */\n doSample: z.boolean().optional(),\n\n /**\n * Controls model thinking and whether reasoning from earlier turns is kept.\n */\n thinking: z\n .object({\n type: z.enum(['enabled', 'disabled']).optional(),\n clearThinking: z.boolean().optional(),\n })\n .optional(),\n\n /**\n * Controls reasoning effort for GLM-5.2 and later models.\n */\n reasoningEffort: z\n .enum(['none', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'])\n .optional(),\n\n /**\n * Enables incremental function-call argument streaming on supported models.\n */\n toolStream: z.boolean().optional(),\n\n /**\n * A caller-provided request identifier between 6 and 64 characters.\n */\n requestId: z.string().min(6).max(64).optional(),\n\n /**\n * A non-sensitive end-user identifier between 6 and 128 characters.\n */\n userId: z.string().min(6).max(128).optional(),\n});\n\nexport type ZaiLanguageModelChatOptions = z.infer<\n typeof zaiLanguageModelChatOptions\n>;\n","import type { ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport { z } from 'zod/v4';\n\nconst zaiErrorDetailsSchema = z.object({\n code: z.union([z.number(), z.string()]).nullish(),\n message: z.string(),\n});\n\nconst zaiErrorSchema = z.union([\n zaiErrorDetailsSchema,\n z.object({ error: zaiErrorDetailsSchema }),\n]);\n\nexport type ZaiErrorData = z.infer<typeof zaiErrorSchema>;\n\nexport const zaiErrorStructure: ProviderErrorStructure<ZaiErrorData> = {\n errorSchema: zaiErrorSchema,\n errorToMessage: data => ('error' in data ? data.error.message : data.message),\n};\n"],"mappings":"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","names":["import_provider_utils","import_v4"]}
|
|
1
|
+
{"version":3,"sources":["../src/zai-provider.ts","../src/version.ts","../src/zai-chat-language-model.ts","../src/zai-chat-language-model-options.ts","../src/zai-error.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type LanguageModelV3,\n type ProviderV3,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { VERSION } from './version';\nimport { ZaiChatLanguageModel } from './zai-chat-language-model';\nimport type { ZaiChatModelId } from './zai-chat-options';\n\nexport interface ZaiProviderSettings {\n /**\n * Z.AI API key. Defaults to the `ZAI_API_KEY` environment variable.\n */\n apiKey?: string;\n\n /**\n * Base URL for API calls. Defaults to\n * `https://api.z.ai/api/paas/v4`.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation.\n */\n fetch?: FetchFunction;\n}\n\nexport interface ZaiProvider extends ProviderV3 {\n /**\n * Creates a Z.AI chat model for text generation.\n */\n (modelId: ZaiChatModelId): LanguageModelV3;\n\n /**\n * Creates a Z.AI language model.\n */\n languageModel(modelId: ZaiChatModelId): LanguageModelV3;\n\n /**\n * Creates a Z.AI chat model.\n */\n chatModel(modelId: ZaiChatModelId): LanguageModelV3;\n\n /**\n * Creates a Z.AI chat model.\n */\n chat(modelId: ZaiChatModelId): LanguageModelV3;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport function createZai(options: ZaiProviderSettings = {}): ZaiProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ?? 'https://api.z.ai/api/paas/v4';\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'ZAI_API_KEY',\n description: 'Z.AI API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk/zai/${VERSION}`,\n );\n\n const createLanguageModel = (modelId: ZaiChatModelId) =>\n new ZaiChatLanguageModel(modelId, {\n provider: 'zai.chat',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = (modelId: ZaiChatModelId) => createLanguageModel(modelId);\n\n provider.specificationVersion = 'v3' as const;\n provider.languageModel = createLanguageModel;\n provider.chatModel = createLanguageModel;\n provider.chat = createLanguageModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n\nexport const zai = createZai();\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","import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3FinishReason,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamPart,\n LanguageModelV3StreamResult,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport {\n parseProviderOptions,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport type { ZaiChatModelId } from './zai-chat-options';\nimport { zaiLanguageModelChatOptions } from './zai-chat-language-model-options';\nimport { zaiErrorStructure } from './zai-error';\n\nexport type ZaiChatConfig = {\n provider: string;\n baseURL: string;\n headers?:\n | Record<string, string | undefined>\n | (() => Record<string, string | undefined>);\n fetch?: FetchFunction;\n};\n\nfunction transformZaiRequestBody(\n args: Record<string, any>,\n): Record<string, any> {\n const {\n doSample,\n frequency_penalty: _frequencyPenalty,\n presence_penalty: _presencePenalty,\n requestId,\n seed: _seed,\n thinking,\n toolStream,\n user: _user,\n userId,\n verbosity: _verbosity,\n ...restArgs\n } = args;\n\n return {\n ...restArgs,\n ...(doSample !== undefined && { do_sample: doSample }),\n ...(thinking !== undefined && {\n thinking: {\n ...(thinking.type !== undefined && { type: thinking.type }),\n ...(thinking.clearThinking !== undefined && {\n clear_thinking: thinking.clearThinking,\n }),\n },\n }),\n ...(toolStream !== undefined && { tool_stream: toolStream }),\n ...(requestId !== undefined && { request_id: requestId }),\n ...(userId !== undefined && { user_id: userId }),\n };\n}\n\nfunction mapZaiFinishReason(\n finishReason: LanguageModelV3FinishReason,\n): LanguageModelV3FinishReason {\n switch (finishReason.raw) {\n case 'sensitive':\n return { unified: 'content-filter', raw: finishReason.raw };\n case 'model_context_window_exceeded':\n return { unified: 'length', raw: finishReason.raw };\n case 'network_error':\n return { unified: 'error', raw: finishReason.raw };\n default:\n return finishReason;\n }\n}\n\nexport class ZaiChatLanguageModel\n extends OpenAICompatibleChatLanguageModel\n implements LanguageModelV3\n{\n constructor(modelId: ZaiChatModelId, config: ZaiChatConfig) {\n const headers = config.headers;\n\n super(modelId, {\n provider: config.provider,\n url: ({ path }) => `${config.baseURL}${path}`,\n headers: () =>\n headers == null\n ? {}\n : typeof headers === 'function'\n ? headers()\n : headers,\n fetch: config.fetch,\n errorStructure: zaiErrorStructure,\n transformRequestBody: transformZaiRequestBody,\n supportedUrls: () => ({\n 'image/*': [/^https?:\\/\\//],\n 'video/*': [/^https?:\\/\\//],\n }),\n });\n }\n\n private async prepareCallOptions(options: LanguageModelV3CallOptions) {\n const warnings: SharedV3Warning[] = [];\n\n const zaiOptions = await parseProviderOptions({\n provider: 'zai',\n providerOptions: options.providerOptions,\n schema: zaiLanguageModelChatOptions,\n });\n\n if (options.frequencyPenalty != null) {\n warnings.push({ type: 'unsupported', feature: 'frequencyPenalty' });\n }\n if (options.presencePenalty != null) {\n warnings.push({ type: 'unsupported', feature: 'presencePenalty' });\n }\n if (options.seed != null) {\n warnings.push({ type: 'unsupported', feature: 'seed' });\n }\n\n let tools = options.tools;\n let toolChoice = options.toolChoice;\n\n if (toolChoice?.type === 'none') {\n tools = undefined;\n toolChoice = undefined;\n } else if (toolChoice != null && toolChoice.type !== 'auto') {\n warnings.push({\n type: 'unsupported',\n feature: `toolChoice ${toolChoice.type}`,\n details: 'Z.AI currently supports only automatic tool selection.',\n });\n toolChoice = undefined;\n }\n\n const normalizedOptions: LanguageModelV3CallOptions = {\n ...options,\n frequencyPenalty: undefined,\n presencePenalty: undefined,\n seed: undefined,\n tools,\n toolChoice,\n providerOptions:\n zaiOptions == null\n ? options.providerOptions\n : {\n ...options.providerOptions,\n zai: zaiOptions,\n },\n };\n\n return { normalizedOptions, warnings };\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const { normalizedOptions, warnings } =\n await this.prepareCallOptions(options);\n const result = await super.doGenerate(normalizedOptions);\n\n return {\n ...result,\n finishReason: mapZaiFinishReason(result.finishReason),\n warnings: [...result.warnings, ...warnings],\n };\n }\n\n async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n const { normalizedOptions, warnings } =\n await this.prepareCallOptions(options);\n const result = await super.doStream(normalizedOptions);\n\n return {\n ...result,\n stream: result.stream.pipeThrough(\n new TransformStream<\n LanguageModelV3StreamPart,\n LanguageModelV3StreamPart\n >({\n transform(part, controller) {\n if (part.type === 'stream-start') {\n controller.enqueue({\n ...part,\n warnings: [...part.warnings, ...warnings],\n });\n return;\n }\n\n if (part.type === 'finish') {\n controller.enqueue({\n ...part,\n finishReason: mapZaiFinishReason(part.finishReason),\n });\n return;\n }\n\n controller.enqueue(part);\n },\n }),\n ),\n };\n }\n}\n","import { z } from 'zod/v4';\n\nexport const zaiLanguageModelChatOptions = z.object({\n /**\n * Enables or disables sampling. When disabled, temperature and topP do not\n * take effect.\n */\n doSample: z.boolean().optional(),\n\n /**\n * Controls model thinking and whether reasoning from earlier turns is kept.\n */\n thinking: z\n .object({\n type: z.enum(['enabled', 'disabled']).optional(),\n clearThinking: z.boolean().optional(),\n })\n .optional(),\n\n /**\n * Controls reasoning effort for GLM-5.2 and later models.\n */\n reasoningEffort: z\n .enum(['none', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'])\n .optional(),\n\n /**\n * Enables incremental function-call argument streaming on supported models.\n */\n toolStream: z.boolean().optional(),\n\n /**\n * A caller-provided request identifier between 6 and 64 characters.\n */\n requestId: z.string().min(6).max(64).optional(),\n\n /**\n * A non-sensitive end-user identifier between 6 and 128 characters.\n */\n userId: z.string().min(6).max(128).optional(),\n});\n\nexport type ZaiLanguageModelChatOptions = z.infer<\n typeof zaiLanguageModelChatOptions\n>;\n","import type { ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport { z } from 'zod/v4';\n\nconst zaiErrorDetailsSchema = z.object({\n code: z.union([z.number(), z.string()]).nullish(),\n message: z.string(),\n});\n\nconst zaiErrorSchema = z.union([\n zaiErrorDetailsSchema,\n z.object({ error: zaiErrorDetailsSchema }),\n]);\n\nexport type ZaiErrorData = z.infer<typeof zaiErrorSchema>;\n\nexport const zaiErrorStructure: ProviderErrorStructure<ZaiErrorData> = {\n errorSchema: zaiErrorSchema,\n errorToMessage: data => ('error' in data ? data.error.message : data.message),\n};\n"],"mappings":"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","names":["z"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/zai",
|
|
3
|
-
"version": "
|
|
4
|
-
"type": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
|
+
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"main": "./dist/index.js",
|
|
8
|
-
"module": "./dist/index.mjs",
|
|
9
8
|
"types": "./dist/index.d.ts",
|
|
10
9
|
"files": [
|
|
11
10
|
"dist/**/*",
|
|
@@ -25,14 +24,14 @@
|
|
|
25
24
|
"./package.json": "./package.json",
|
|
26
25
|
".": {
|
|
27
26
|
"types": "./dist/index.d.ts",
|
|
28
|
-
"import": "./dist/index.
|
|
29
|
-
"
|
|
27
|
+
"import": "./dist/index.js",
|
|
28
|
+
"default": "./dist/index.js"
|
|
30
29
|
}
|
|
31
30
|
},
|
|
32
31
|
"dependencies": {
|
|
33
|
-
"@ai-sdk/openai-compatible": "
|
|
34
|
-
"@ai-sdk/provider": "
|
|
35
|
-
"@ai-sdk/provider-utils": "
|
|
32
|
+
"@ai-sdk/openai-compatible": "2.0.73",
|
|
33
|
+
"@ai-sdk/provider": "3.0.15",
|
|
34
|
+
"@ai-sdk/provider-utils": "4.0.49"
|
|
36
35
|
},
|
|
37
36
|
"devDependencies": {
|
|
38
37
|
"@types/node": "20.17.24",
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';
|
|
2
2
|
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
LanguageModelV3,
|
|
4
|
+
LanguageModelV3CallOptions,
|
|
5
|
+
LanguageModelV3FinishReason,
|
|
6
|
+
LanguageModelV3GenerateResult,
|
|
7
|
+
LanguageModelV3StreamPart,
|
|
8
|
+
LanguageModelV3StreamResult,
|
|
9
|
+
SharedV3Warning,
|
|
8
10
|
} from '@ai-sdk/provider';
|
|
9
11
|
import {
|
|
10
12
|
parseProviderOptions,
|
|
@@ -58,43 +60,23 @@ function transformZaiRequestBody(
|
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
function mapZaiFinishReason(
|
|
61
|
-
finishReason:
|
|
62
|
-
|
|
63
|
-
)
|
|
64
|
-
switch (rawFinishReason) {
|
|
63
|
+
finishReason: LanguageModelV3FinishReason,
|
|
64
|
+
): LanguageModelV3FinishReason {
|
|
65
|
+
switch (finishReason.raw) {
|
|
65
66
|
case 'sensitive':
|
|
66
|
-
return 'content-filter';
|
|
67
|
+
return { unified: 'content-filter', raw: finishReason.raw };
|
|
67
68
|
case 'model_context_window_exceeded':
|
|
68
|
-
return 'length';
|
|
69
|
+
return { unified: 'length', raw: finishReason.raw };
|
|
69
70
|
case 'network_error':
|
|
70
|
-
return 'error';
|
|
71
|
+
return { unified: 'error', raw: finishReason.raw };
|
|
71
72
|
default:
|
|
72
73
|
return finishReason;
|
|
73
74
|
}
|
|
74
75
|
}
|
|
75
76
|
|
|
76
|
-
function getRawFinishReason(responseBody: unknown): string | undefined {
|
|
77
|
-
if (responseBody == null || typeof responseBody !== 'object') {
|
|
78
|
-
return undefined;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const choices = (responseBody as { choices?: unknown }).choices;
|
|
82
|
-
if (!Array.isArray(choices) || choices.length === 0) {
|
|
83
|
-
return undefined;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const choice = choices[0];
|
|
87
|
-
if (choice == null || typeof choice !== 'object') {
|
|
88
|
-
return undefined;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const finishReason = (choice as { finish_reason?: unknown }).finish_reason;
|
|
92
|
-
return typeof finishReason === 'string' ? finishReason : undefined;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
77
|
export class ZaiChatLanguageModel
|
|
96
78
|
extends OpenAICompatibleChatLanguageModel
|
|
97
|
-
implements
|
|
79
|
+
implements LanguageModelV3
|
|
98
80
|
{
|
|
99
81
|
constructor(modelId: ZaiChatModelId, config: ZaiChatConfig) {
|
|
100
82
|
const headers = config.headers;
|
|
@@ -118,8 +100,8 @@ export class ZaiChatLanguageModel
|
|
|
118
100
|
});
|
|
119
101
|
}
|
|
120
102
|
|
|
121
|
-
private async prepareCallOptions(options:
|
|
122
|
-
const warnings:
|
|
103
|
+
private async prepareCallOptions(options: LanguageModelV3CallOptions) {
|
|
104
|
+
const warnings: SharedV3Warning[] = [];
|
|
123
105
|
|
|
124
106
|
const zaiOptions = await parseProviderOptions({
|
|
125
107
|
provider: 'zai',
|
|
@@ -128,19 +110,13 @@ export class ZaiChatLanguageModel
|
|
|
128
110
|
});
|
|
129
111
|
|
|
130
112
|
if (options.frequencyPenalty != null) {
|
|
131
|
-
warnings.push({
|
|
132
|
-
type: 'unsupported-setting',
|
|
133
|
-
setting: 'frequencyPenalty',
|
|
134
|
-
});
|
|
113
|
+
warnings.push({ type: 'unsupported', feature: 'frequencyPenalty' });
|
|
135
114
|
}
|
|
136
115
|
if (options.presencePenalty != null) {
|
|
137
|
-
warnings.push({
|
|
138
|
-
type: 'unsupported-setting',
|
|
139
|
-
setting: 'presencePenalty',
|
|
140
|
-
});
|
|
116
|
+
warnings.push({ type: 'unsupported', feature: 'presencePenalty' });
|
|
141
117
|
}
|
|
142
118
|
if (options.seed != null) {
|
|
143
|
-
warnings.push({ type: 'unsupported
|
|
119
|
+
warnings.push({ type: 'unsupported', feature: 'seed' });
|
|
144
120
|
}
|
|
145
121
|
|
|
146
122
|
let tools = options.tools;
|
|
@@ -151,14 +127,14 @@ export class ZaiChatLanguageModel
|
|
|
151
127
|
toolChoice = undefined;
|
|
152
128
|
} else if (toolChoice != null && toolChoice.type !== 'auto') {
|
|
153
129
|
warnings.push({
|
|
154
|
-
type: 'unsupported
|
|
155
|
-
|
|
130
|
+
type: 'unsupported',
|
|
131
|
+
feature: `toolChoice ${toolChoice.type}`,
|
|
156
132
|
details: 'Z.AI currently supports only automatic tool selection.',
|
|
157
133
|
});
|
|
158
134
|
toolChoice = undefined;
|
|
159
135
|
}
|
|
160
136
|
|
|
161
|
-
const normalizedOptions:
|
|
137
|
+
const normalizedOptions: LanguageModelV3CallOptions = {
|
|
162
138
|
...options,
|
|
163
139
|
frequencyPenalty: undefined,
|
|
164
140
|
presencePenalty: undefined,
|
|
@@ -178,41 +154,32 @@ export class ZaiChatLanguageModel
|
|
|
178
154
|
}
|
|
179
155
|
|
|
180
156
|
async doGenerate(
|
|
181
|
-
options:
|
|
182
|
-
): Promise<
|
|
157
|
+
options: LanguageModelV3CallOptions,
|
|
158
|
+
): Promise<LanguageModelV3GenerateResult> {
|
|
183
159
|
const { normalizedOptions, warnings } =
|
|
184
160
|
await this.prepareCallOptions(options);
|
|
185
161
|
const result = await super.doGenerate(normalizedOptions);
|
|
186
162
|
|
|
187
163
|
return {
|
|
188
164
|
...result,
|
|
189
|
-
finishReason: mapZaiFinishReason(
|
|
190
|
-
result.finishReason,
|
|
191
|
-
getRawFinishReason(result.response?.body),
|
|
192
|
-
),
|
|
165
|
+
finishReason: mapZaiFinishReason(result.finishReason),
|
|
193
166
|
warnings: [...result.warnings, ...warnings],
|
|
194
167
|
};
|
|
195
168
|
}
|
|
196
169
|
|
|
197
170
|
async doStream(
|
|
198
|
-
options:
|
|
199
|
-
): Promise<
|
|
200
|
-
const originalIncludeRawChunks = options.includeRawChunks;
|
|
171
|
+
options: LanguageModelV3CallOptions,
|
|
172
|
+
): Promise<LanguageModelV3StreamResult> {
|
|
201
173
|
const { normalizedOptions, warnings } =
|
|
202
174
|
await this.prepareCallOptions(options);
|
|
203
|
-
const result = await super.doStream(
|
|
204
|
-
...normalizedOptions,
|
|
205
|
-
includeRawChunks: true,
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
let rawFinishReason: string | undefined;
|
|
175
|
+
const result = await super.doStream(normalizedOptions);
|
|
209
176
|
|
|
210
177
|
return {
|
|
211
178
|
...result,
|
|
212
179
|
stream: result.stream.pipeThrough(
|
|
213
180
|
new TransformStream<
|
|
214
|
-
|
|
215
|
-
|
|
181
|
+
LanguageModelV3StreamPart,
|
|
182
|
+
LanguageModelV3StreamPart
|
|
216
183
|
>({
|
|
217
184
|
transform(part, controller) {
|
|
218
185
|
if (part.type === 'stream-start') {
|
|
@@ -223,22 +190,10 @@ export class ZaiChatLanguageModel
|
|
|
223
190
|
return;
|
|
224
191
|
}
|
|
225
192
|
|
|
226
|
-
if (part.type === 'raw') {
|
|
227
|
-
rawFinishReason =
|
|
228
|
-
getRawFinishReason(part.rawValue) ?? rawFinishReason;
|
|
229
|
-
if (originalIncludeRawChunks) {
|
|
230
|
-
controller.enqueue(part);
|
|
231
|
-
}
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
193
|
if (part.type === 'finish') {
|
|
236
194
|
controller.enqueue({
|
|
237
195
|
...part,
|
|
238
|
-
finishReason: mapZaiFinishReason(
|
|
239
|
-
part.finishReason,
|
|
240
|
-
rawFinishReason,
|
|
241
|
-
),
|
|
196
|
+
finishReason: mapZaiFinishReason(part.finishReason),
|
|
242
197
|
});
|
|
243
198
|
return;
|
|
244
199
|
}
|
package/src/zai-provider.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
NoSuchModelError,
|
|
3
|
-
type
|
|
4
|
-
type
|
|
3
|
+
type LanguageModelV3,
|
|
4
|
+
type ProviderV3,
|
|
5
5
|
} from '@ai-sdk/provider';
|
|
6
6
|
import {
|
|
7
7
|
loadApiKey,
|
|
@@ -36,26 +36,31 @@ export interface ZaiProviderSettings {
|
|
|
36
36
|
fetch?: FetchFunction;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
export interface ZaiProvider extends
|
|
39
|
+
export interface ZaiProvider extends ProviderV3 {
|
|
40
40
|
/**
|
|
41
41
|
* Creates a Z.AI chat model for text generation.
|
|
42
42
|
*/
|
|
43
|
-
(modelId: ZaiChatModelId):
|
|
43
|
+
(modelId: ZaiChatModelId): LanguageModelV3;
|
|
44
44
|
|
|
45
45
|
/**
|
|
46
46
|
* Creates a Z.AI language model.
|
|
47
47
|
*/
|
|
48
|
-
languageModel(modelId: ZaiChatModelId):
|
|
48
|
+
languageModel(modelId: ZaiChatModelId): LanguageModelV3;
|
|
49
49
|
|
|
50
50
|
/**
|
|
51
51
|
* Creates a Z.AI chat model.
|
|
52
52
|
*/
|
|
53
|
-
chatModel(modelId: ZaiChatModelId):
|
|
53
|
+
chatModel(modelId: ZaiChatModelId): LanguageModelV3;
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
56
|
* Creates a Z.AI chat model.
|
|
57
57
|
*/
|
|
58
|
-
chat(modelId: ZaiChatModelId):
|
|
58
|
+
chat(modelId: ZaiChatModelId): LanguageModelV3;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @deprecated Use `embeddingModel` instead.
|
|
62
|
+
*/
|
|
63
|
+
textEmbeddingModel(modelId: string): never;
|
|
59
64
|
}
|
|
60
65
|
|
|
61
66
|
export function createZai(options: ZaiProviderSettings = {}): ZaiProvider {
|
|
@@ -85,14 +90,15 @@ export function createZai(options: ZaiProviderSettings = {}): ZaiProvider {
|
|
|
85
90
|
|
|
86
91
|
const provider = (modelId: ZaiChatModelId) => createLanguageModel(modelId);
|
|
87
92
|
|
|
88
|
-
provider.specificationVersion = '
|
|
93
|
+
provider.specificationVersion = 'v3' as const;
|
|
89
94
|
provider.languageModel = createLanguageModel;
|
|
90
95
|
provider.chatModel = createLanguageModel;
|
|
91
96
|
provider.chat = createLanguageModel;
|
|
92
97
|
|
|
93
|
-
provider.
|
|
94
|
-
throw new NoSuchModelError({ modelId, modelType: '
|
|
98
|
+
provider.embeddingModel = (modelId: string) => {
|
|
99
|
+
throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });
|
|
95
100
|
};
|
|
101
|
+
provider.textEmbeddingModel = provider.embeddingModel;
|
|
96
102
|
provider.imageModel = (modelId: string) => {
|
|
97
103
|
throw new NoSuchModelError({ modelId, modelType: 'imageModel' });
|
|
98
104
|
};
|
package/dist/index.d.mts
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod/v4';
|
|
2
|
-
import { ProviderV2, LanguageModelV2 } from '@ai-sdk/provider';
|
|
3
|
-
import { FetchFunction } from '@ai-sdk/provider-utils';
|
|
4
|
-
|
|
5
|
-
declare const zaiLanguageModelChatOptions: z.ZodObject<{
|
|
6
|
-
doSample: z.ZodOptional<z.ZodBoolean>;
|
|
7
|
-
thinking: z.ZodOptional<z.ZodObject<{
|
|
8
|
-
type: z.ZodOptional<z.ZodEnum<{
|
|
9
|
-
enabled: "enabled";
|
|
10
|
-
disabled: "disabled";
|
|
11
|
-
}>>;
|
|
12
|
-
clearThinking: z.ZodOptional<z.ZodBoolean>;
|
|
13
|
-
}, z.core.$strip>>;
|
|
14
|
-
reasoningEffort: z.ZodOptional<z.ZodEnum<{
|
|
15
|
-
none: "none";
|
|
16
|
-
minimal: "minimal";
|
|
17
|
-
low: "low";
|
|
18
|
-
medium: "medium";
|
|
19
|
-
high: "high";
|
|
20
|
-
xhigh: "xhigh";
|
|
21
|
-
max: "max";
|
|
22
|
-
}>>;
|
|
23
|
-
toolStream: z.ZodOptional<z.ZodBoolean>;
|
|
24
|
-
requestId: z.ZodOptional<z.ZodString>;
|
|
25
|
-
userId: z.ZodOptional<z.ZodString>;
|
|
26
|
-
}, z.core.$strip>;
|
|
27
|
-
type ZaiLanguageModelChatOptions = z.infer<typeof zaiLanguageModelChatOptions>;
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Z.AI chat model ids from the official OpenAPI 1.0.0 specification,
|
|
31
|
-
* retrieved from https://docs.z.ai/openapi.json on 2026-08-26.
|
|
32
|
-
*/
|
|
33
|
-
type ZaiChatModelId = 'glm-5.3' | 'glm-5.2' | 'glm-5.1' | 'glm-5-turbo' | 'glm-5' | 'glm-4.7' | 'glm-4.7-flash' | 'glm-4.7-flashx' | 'glm-4.6' | 'glm-4.5' | 'glm-4.5-air' | 'glm-4.5-x' | 'glm-4.5-airx' | 'glm-4.5-flash' | 'glm-4-32b-0414-128k' | 'glm-5.3-flash' | 'glm-5v-turbo' | 'glm-4.6v' | 'glm-4.6v-flash' | 'glm-4.6v-flashx' | 'glm-4.5v' | 'autoglm-phone-multilingual' | (string & {});
|
|
34
|
-
|
|
35
|
-
declare const zaiErrorSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
36
|
-
code: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>>;
|
|
37
|
-
message: z.ZodString;
|
|
38
|
-
}, z.core.$strip>, z.ZodObject<{
|
|
39
|
-
error: z.ZodObject<{
|
|
40
|
-
code: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>>;
|
|
41
|
-
message: z.ZodString;
|
|
42
|
-
}, z.core.$strip>;
|
|
43
|
-
}, z.core.$strip>]>;
|
|
44
|
-
type ZaiErrorData = z.infer<typeof zaiErrorSchema>;
|
|
45
|
-
|
|
46
|
-
interface ZaiProviderSettings {
|
|
47
|
-
/**
|
|
48
|
-
* Z.AI API key. Defaults to the `ZAI_API_KEY` environment variable.
|
|
49
|
-
*/
|
|
50
|
-
apiKey?: string;
|
|
51
|
-
/**
|
|
52
|
-
* Base URL for API calls. Defaults to
|
|
53
|
-
* `https://api.z.ai/api/paas/v4`.
|
|
54
|
-
*/
|
|
55
|
-
baseURL?: string;
|
|
56
|
-
/**
|
|
57
|
-
* Custom headers to include in requests.
|
|
58
|
-
*/
|
|
59
|
-
headers?: Record<string, string>;
|
|
60
|
-
/**
|
|
61
|
-
* Custom fetch implementation.
|
|
62
|
-
*/
|
|
63
|
-
fetch?: FetchFunction;
|
|
64
|
-
}
|
|
65
|
-
interface ZaiProvider extends ProviderV2 {
|
|
66
|
-
/**
|
|
67
|
-
* Creates a Z.AI chat model for text generation.
|
|
68
|
-
*/
|
|
69
|
-
(modelId: ZaiChatModelId): LanguageModelV2;
|
|
70
|
-
/**
|
|
71
|
-
* Creates a Z.AI language model.
|
|
72
|
-
*/
|
|
73
|
-
languageModel(modelId: ZaiChatModelId): LanguageModelV2;
|
|
74
|
-
/**
|
|
75
|
-
* Creates a Z.AI chat model.
|
|
76
|
-
*/
|
|
77
|
-
chatModel(modelId: ZaiChatModelId): LanguageModelV2;
|
|
78
|
-
/**
|
|
79
|
-
* Creates a Z.AI chat model.
|
|
80
|
-
*/
|
|
81
|
-
chat(modelId: ZaiChatModelId): LanguageModelV2;
|
|
82
|
-
}
|
|
83
|
-
declare function createZai(options?: ZaiProviderSettings): ZaiProvider;
|
|
84
|
-
declare const zai: ZaiProvider;
|
|
85
|
-
|
|
86
|
-
declare const VERSION: string;
|
|
87
|
-
|
|
88
|
-
export { VERSION, type ZaiChatModelId, type ZaiErrorData, type ZaiLanguageModelChatOptions, type ZaiProvider, type ZaiProviderSettings, createZai, zai };
|
package/dist/index.mjs
DELETED
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
// src/zai-provider.ts
|
|
2
|
-
import {
|
|
3
|
-
NoSuchModelError
|
|
4
|
-
} from "@ai-sdk/provider";
|
|
5
|
-
import {
|
|
6
|
-
loadApiKey,
|
|
7
|
-
withoutTrailingSlash,
|
|
8
|
-
withUserAgentSuffix
|
|
9
|
-
} from "@ai-sdk/provider-utils";
|
|
10
|
-
|
|
11
|
-
// src/version.ts
|
|
12
|
-
var VERSION = true ? "1.0.1" : "0.0.0-test";
|
|
13
|
-
|
|
14
|
-
// src/zai-chat-language-model.ts
|
|
15
|
-
import { OpenAICompatibleChatLanguageModel } from "@ai-sdk/openai-compatible";
|
|
16
|
-
import {
|
|
17
|
-
parseProviderOptions
|
|
18
|
-
} from "@ai-sdk/provider-utils";
|
|
19
|
-
|
|
20
|
-
// src/zai-chat-language-model-options.ts
|
|
21
|
-
import { z } from "zod/v4";
|
|
22
|
-
var zaiLanguageModelChatOptions = z.object({
|
|
23
|
-
/**
|
|
24
|
-
* Enables or disables sampling. When disabled, temperature and topP do not
|
|
25
|
-
* take effect.
|
|
26
|
-
*/
|
|
27
|
-
doSample: z.boolean().optional(),
|
|
28
|
-
/**
|
|
29
|
-
* Controls model thinking and whether reasoning from earlier turns is kept.
|
|
30
|
-
*/
|
|
31
|
-
thinking: z.object({
|
|
32
|
-
type: z.enum(["enabled", "disabled"]).optional(),
|
|
33
|
-
clearThinking: z.boolean().optional()
|
|
34
|
-
}).optional(),
|
|
35
|
-
/**
|
|
36
|
-
* Controls reasoning effort for GLM-5.2 and later models.
|
|
37
|
-
*/
|
|
38
|
-
reasoningEffort: z.enum(["none", "minimal", "low", "medium", "high", "xhigh", "max"]).optional(),
|
|
39
|
-
/**
|
|
40
|
-
* Enables incremental function-call argument streaming on supported models.
|
|
41
|
-
*/
|
|
42
|
-
toolStream: z.boolean().optional(),
|
|
43
|
-
/**
|
|
44
|
-
* A caller-provided request identifier between 6 and 64 characters.
|
|
45
|
-
*/
|
|
46
|
-
requestId: z.string().min(6).max(64).optional(),
|
|
47
|
-
/**
|
|
48
|
-
* A non-sensitive end-user identifier between 6 and 128 characters.
|
|
49
|
-
*/
|
|
50
|
-
userId: z.string().min(6).max(128).optional()
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
// src/zai-error.ts
|
|
54
|
-
import { z as z2 } from "zod/v4";
|
|
55
|
-
var zaiErrorDetailsSchema = z2.object({
|
|
56
|
-
code: z2.union([z2.number(), z2.string()]).nullish(),
|
|
57
|
-
message: z2.string()
|
|
58
|
-
});
|
|
59
|
-
var zaiErrorSchema = z2.union([
|
|
60
|
-
zaiErrorDetailsSchema,
|
|
61
|
-
z2.object({ error: zaiErrorDetailsSchema })
|
|
62
|
-
]);
|
|
63
|
-
var zaiErrorStructure = {
|
|
64
|
-
errorSchema: zaiErrorSchema,
|
|
65
|
-
errorToMessage: (data) => "error" in data ? data.error.message : data.message
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
// src/zai-chat-language-model.ts
|
|
69
|
-
function transformZaiRequestBody(args) {
|
|
70
|
-
const {
|
|
71
|
-
doSample,
|
|
72
|
-
frequency_penalty: _frequencyPenalty,
|
|
73
|
-
presence_penalty: _presencePenalty,
|
|
74
|
-
requestId,
|
|
75
|
-
seed: _seed,
|
|
76
|
-
thinking,
|
|
77
|
-
toolStream,
|
|
78
|
-
user: _user,
|
|
79
|
-
userId,
|
|
80
|
-
verbosity: _verbosity,
|
|
81
|
-
...restArgs
|
|
82
|
-
} = args;
|
|
83
|
-
return {
|
|
84
|
-
...restArgs,
|
|
85
|
-
...doSample !== void 0 && { do_sample: doSample },
|
|
86
|
-
...thinking !== void 0 && {
|
|
87
|
-
thinking: {
|
|
88
|
-
...thinking.type !== void 0 && { type: thinking.type },
|
|
89
|
-
...thinking.clearThinking !== void 0 && {
|
|
90
|
-
clear_thinking: thinking.clearThinking
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
...toolStream !== void 0 && { tool_stream: toolStream },
|
|
95
|
-
...requestId !== void 0 && { request_id: requestId },
|
|
96
|
-
...userId !== void 0 && { user_id: userId }
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
function mapZaiFinishReason(finishReason, rawFinishReason) {
|
|
100
|
-
switch (rawFinishReason) {
|
|
101
|
-
case "sensitive":
|
|
102
|
-
return "content-filter";
|
|
103
|
-
case "model_context_window_exceeded":
|
|
104
|
-
return "length";
|
|
105
|
-
case "network_error":
|
|
106
|
-
return "error";
|
|
107
|
-
default:
|
|
108
|
-
return finishReason;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
function getRawFinishReason(responseBody) {
|
|
112
|
-
if (responseBody == null || typeof responseBody !== "object") {
|
|
113
|
-
return void 0;
|
|
114
|
-
}
|
|
115
|
-
const choices = responseBody.choices;
|
|
116
|
-
if (!Array.isArray(choices) || choices.length === 0) {
|
|
117
|
-
return void 0;
|
|
118
|
-
}
|
|
119
|
-
const choice = choices[0];
|
|
120
|
-
if (choice == null || typeof choice !== "object") {
|
|
121
|
-
return void 0;
|
|
122
|
-
}
|
|
123
|
-
const finishReason = choice.finish_reason;
|
|
124
|
-
return typeof finishReason === "string" ? finishReason : void 0;
|
|
125
|
-
}
|
|
126
|
-
var ZaiChatLanguageModel = class extends OpenAICompatibleChatLanguageModel {
|
|
127
|
-
constructor(modelId, config) {
|
|
128
|
-
const headers = config.headers;
|
|
129
|
-
super(modelId, {
|
|
130
|
-
provider: config.provider,
|
|
131
|
-
url: ({ path }) => `${config.baseURL}${path}`,
|
|
132
|
-
headers: () => headers == null ? {} : typeof headers === "function" ? headers() : headers,
|
|
133
|
-
fetch: config.fetch,
|
|
134
|
-
errorStructure: zaiErrorStructure,
|
|
135
|
-
transformRequestBody: transformZaiRequestBody,
|
|
136
|
-
supportedUrls: () => ({
|
|
137
|
-
"image/*": [/^https?:\/\//],
|
|
138
|
-
"video/*": [/^https?:\/\//]
|
|
139
|
-
})
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
async prepareCallOptions(options) {
|
|
143
|
-
const warnings = [];
|
|
144
|
-
const zaiOptions = await parseProviderOptions({
|
|
145
|
-
provider: "zai",
|
|
146
|
-
providerOptions: options.providerOptions,
|
|
147
|
-
schema: zaiLanguageModelChatOptions
|
|
148
|
-
});
|
|
149
|
-
if (options.frequencyPenalty != null) {
|
|
150
|
-
warnings.push({
|
|
151
|
-
type: "unsupported-setting",
|
|
152
|
-
setting: "frequencyPenalty"
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
if (options.presencePenalty != null) {
|
|
156
|
-
warnings.push({
|
|
157
|
-
type: "unsupported-setting",
|
|
158
|
-
setting: "presencePenalty"
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
if (options.seed != null) {
|
|
162
|
-
warnings.push({ type: "unsupported-setting", setting: "seed" });
|
|
163
|
-
}
|
|
164
|
-
let tools = options.tools;
|
|
165
|
-
let toolChoice = options.toolChoice;
|
|
166
|
-
if ((toolChoice == null ? void 0 : toolChoice.type) === "none") {
|
|
167
|
-
tools = void 0;
|
|
168
|
-
toolChoice = void 0;
|
|
169
|
-
} else if (toolChoice != null && toolChoice.type !== "auto") {
|
|
170
|
-
warnings.push({
|
|
171
|
-
type: "unsupported-setting",
|
|
172
|
-
setting: "toolChoice",
|
|
173
|
-
details: "Z.AI currently supports only automatic tool selection."
|
|
174
|
-
});
|
|
175
|
-
toolChoice = void 0;
|
|
176
|
-
}
|
|
177
|
-
const normalizedOptions = {
|
|
178
|
-
...options,
|
|
179
|
-
frequencyPenalty: void 0,
|
|
180
|
-
presencePenalty: void 0,
|
|
181
|
-
seed: void 0,
|
|
182
|
-
tools,
|
|
183
|
-
toolChoice,
|
|
184
|
-
providerOptions: zaiOptions == null ? options.providerOptions : {
|
|
185
|
-
...options.providerOptions,
|
|
186
|
-
zai: zaiOptions
|
|
187
|
-
}
|
|
188
|
-
};
|
|
189
|
-
return { normalizedOptions, warnings };
|
|
190
|
-
}
|
|
191
|
-
async doGenerate(options) {
|
|
192
|
-
var _a;
|
|
193
|
-
const { normalizedOptions, warnings } = await this.prepareCallOptions(options);
|
|
194
|
-
const result = await super.doGenerate(normalizedOptions);
|
|
195
|
-
return {
|
|
196
|
-
...result,
|
|
197
|
-
finishReason: mapZaiFinishReason(
|
|
198
|
-
result.finishReason,
|
|
199
|
-
getRawFinishReason((_a = result.response) == null ? void 0 : _a.body)
|
|
200
|
-
),
|
|
201
|
-
warnings: [...result.warnings, ...warnings]
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
async doStream(options) {
|
|
205
|
-
const originalIncludeRawChunks = options.includeRawChunks;
|
|
206
|
-
const { normalizedOptions, warnings } = await this.prepareCallOptions(options);
|
|
207
|
-
const result = await super.doStream({
|
|
208
|
-
...normalizedOptions,
|
|
209
|
-
includeRawChunks: true
|
|
210
|
-
});
|
|
211
|
-
let rawFinishReason;
|
|
212
|
-
return {
|
|
213
|
-
...result,
|
|
214
|
-
stream: result.stream.pipeThrough(
|
|
215
|
-
new TransformStream({
|
|
216
|
-
transform(part, controller) {
|
|
217
|
-
var _a;
|
|
218
|
-
if (part.type === "stream-start") {
|
|
219
|
-
controller.enqueue({
|
|
220
|
-
...part,
|
|
221
|
-
warnings: [...part.warnings, ...warnings]
|
|
222
|
-
});
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
if (part.type === "raw") {
|
|
226
|
-
rawFinishReason = (_a = getRawFinishReason(part.rawValue)) != null ? _a : rawFinishReason;
|
|
227
|
-
if (originalIncludeRawChunks) {
|
|
228
|
-
controller.enqueue(part);
|
|
229
|
-
}
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
if (part.type === "finish") {
|
|
233
|
-
controller.enqueue({
|
|
234
|
-
...part,
|
|
235
|
-
finishReason: mapZaiFinishReason(
|
|
236
|
-
part.finishReason,
|
|
237
|
-
rawFinishReason
|
|
238
|
-
)
|
|
239
|
-
});
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
controller.enqueue(part);
|
|
243
|
-
}
|
|
244
|
-
})
|
|
245
|
-
)
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
};
|
|
249
|
-
|
|
250
|
-
// src/zai-provider.ts
|
|
251
|
-
function createZai(options = {}) {
|
|
252
|
-
var _a;
|
|
253
|
-
const baseURL = (_a = withoutTrailingSlash(options.baseURL)) != null ? _a : "https://api.z.ai/api/paas/v4";
|
|
254
|
-
const getHeaders = () => withUserAgentSuffix(
|
|
255
|
-
{
|
|
256
|
-
Authorization: `Bearer ${loadApiKey({
|
|
257
|
-
apiKey: options.apiKey,
|
|
258
|
-
environmentVariableName: "ZAI_API_KEY",
|
|
259
|
-
description: "Z.AI API key"
|
|
260
|
-
})}`,
|
|
261
|
-
...options.headers
|
|
262
|
-
},
|
|
263
|
-
`ai-sdk/zai/${VERSION}`
|
|
264
|
-
);
|
|
265
|
-
const createLanguageModel = (modelId) => new ZaiChatLanguageModel(modelId, {
|
|
266
|
-
provider: "zai.chat",
|
|
267
|
-
baseURL,
|
|
268
|
-
headers: getHeaders,
|
|
269
|
-
fetch: options.fetch
|
|
270
|
-
});
|
|
271
|
-
const provider = (modelId) => createLanguageModel(modelId);
|
|
272
|
-
provider.specificationVersion = "v2";
|
|
273
|
-
provider.languageModel = createLanguageModel;
|
|
274
|
-
provider.chatModel = createLanguageModel;
|
|
275
|
-
provider.chat = createLanguageModel;
|
|
276
|
-
provider.textEmbeddingModel = (modelId) => {
|
|
277
|
-
throw new NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
|
|
278
|
-
};
|
|
279
|
-
provider.imageModel = (modelId) => {
|
|
280
|
-
throw new NoSuchModelError({ modelId, modelType: "imageModel" });
|
|
281
|
-
};
|
|
282
|
-
return provider;
|
|
283
|
-
}
|
|
284
|
-
var zai = createZai();
|
|
285
|
-
export {
|
|
286
|
-
VERSION,
|
|
287
|
-
createZai,
|
|
288
|
-
zai
|
|
289
|
-
};
|
|
290
|
-
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/zai-provider.ts","../src/version.ts","../src/zai-chat-language-model.ts","../src/zai-chat-language-model-options.ts","../src/zai-error.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type LanguageModelV2,\n type ProviderV2,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { VERSION } from './version';\nimport { ZaiChatLanguageModel } from './zai-chat-language-model';\nimport type { ZaiChatModelId } from './zai-chat-options';\n\nexport interface ZaiProviderSettings {\n /**\n * Z.AI API key. Defaults to the `ZAI_API_KEY` environment variable.\n */\n apiKey?: string;\n\n /**\n * Base URL for API calls. Defaults to\n * `https://api.z.ai/api/paas/v4`.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation.\n */\n fetch?: FetchFunction;\n}\n\nexport interface ZaiProvider extends ProviderV2 {\n /**\n * Creates a Z.AI chat model for text generation.\n */\n (modelId: ZaiChatModelId): LanguageModelV2;\n\n /**\n * Creates a Z.AI language model.\n */\n languageModel(modelId: ZaiChatModelId): LanguageModelV2;\n\n /**\n * Creates a Z.AI chat model.\n */\n chatModel(modelId: ZaiChatModelId): LanguageModelV2;\n\n /**\n * Creates a Z.AI chat model.\n */\n chat(modelId: ZaiChatModelId): LanguageModelV2;\n}\n\nexport function createZai(options: ZaiProviderSettings = {}): ZaiProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL) ?? 'https://api.z.ai/api/paas/v4';\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'ZAI_API_KEY',\n description: 'Z.AI API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk/zai/${VERSION}`,\n );\n\n const createLanguageModel = (modelId: ZaiChatModelId) =>\n new ZaiChatLanguageModel(modelId, {\n provider: 'zai.chat',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = (modelId: ZaiChatModelId) => createLanguageModel(modelId);\n\n provider.specificationVersion = 'v2' as const;\n provider.languageModel = createLanguageModel;\n provider.chatModel = createLanguageModel;\n provider.chat = createLanguageModel;\n\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n\nexport const zai = createZai();\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","import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2CallWarning,\n LanguageModelV2FinishReason,\n LanguageModelV2StreamPart,\n} from '@ai-sdk/provider';\nimport {\n parseProviderOptions,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport type { ZaiChatModelId } from './zai-chat-options';\nimport { zaiLanguageModelChatOptions } from './zai-chat-language-model-options';\nimport { zaiErrorStructure } from './zai-error';\n\nexport type ZaiChatConfig = {\n provider: string;\n baseURL: string;\n headers?:\n | Record<string, string | undefined>\n | (() => Record<string, string | undefined>);\n fetch?: FetchFunction;\n};\n\nfunction transformZaiRequestBody(\n args: Record<string, any>,\n): Record<string, any> {\n const {\n doSample,\n frequency_penalty: _frequencyPenalty,\n presence_penalty: _presencePenalty,\n requestId,\n seed: _seed,\n thinking,\n toolStream,\n user: _user,\n userId,\n verbosity: _verbosity,\n ...restArgs\n } = args;\n\n return {\n ...restArgs,\n ...(doSample !== undefined && { do_sample: doSample }),\n ...(thinking !== undefined && {\n thinking: {\n ...(thinking.type !== undefined && { type: thinking.type }),\n ...(thinking.clearThinking !== undefined && {\n clear_thinking: thinking.clearThinking,\n }),\n },\n }),\n ...(toolStream !== undefined && { tool_stream: toolStream }),\n ...(requestId !== undefined && { request_id: requestId }),\n ...(userId !== undefined && { user_id: userId }),\n };\n}\n\nfunction mapZaiFinishReason(\n finishReason: LanguageModelV2FinishReason,\n rawFinishReason: string | undefined,\n): LanguageModelV2FinishReason {\n switch (rawFinishReason) {\n case 'sensitive':\n return 'content-filter';\n case 'model_context_window_exceeded':\n return 'length';\n case 'network_error':\n return 'error';\n default:\n return finishReason;\n }\n}\n\nfunction getRawFinishReason(responseBody: unknown): string | undefined {\n if (responseBody == null || typeof responseBody !== 'object') {\n return undefined;\n }\n\n const choices = (responseBody as { choices?: unknown }).choices;\n if (!Array.isArray(choices) || choices.length === 0) {\n return undefined;\n }\n\n const choice = choices[0];\n if (choice == null || typeof choice !== 'object') {\n return undefined;\n }\n\n const finishReason = (choice as { finish_reason?: unknown }).finish_reason;\n return typeof finishReason === 'string' ? finishReason : undefined;\n}\n\nexport class ZaiChatLanguageModel\n extends OpenAICompatibleChatLanguageModel\n implements LanguageModelV2\n{\n constructor(modelId: ZaiChatModelId, config: ZaiChatConfig) {\n const headers = config.headers;\n\n super(modelId, {\n provider: config.provider,\n url: ({ path }) => `${config.baseURL}${path}`,\n headers: () =>\n headers == null\n ? {}\n : typeof headers === 'function'\n ? headers()\n : headers,\n fetch: config.fetch,\n errorStructure: zaiErrorStructure,\n transformRequestBody: transformZaiRequestBody,\n supportedUrls: () => ({\n 'image/*': [/^https?:\\/\\//],\n 'video/*': [/^https?:\\/\\//],\n }),\n });\n }\n\n private async prepareCallOptions(options: LanguageModelV2CallOptions) {\n const warnings: LanguageModelV2CallWarning[] = [];\n\n const zaiOptions = await parseProviderOptions({\n provider: 'zai',\n providerOptions: options.providerOptions,\n schema: zaiLanguageModelChatOptions,\n });\n\n if (options.frequencyPenalty != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'frequencyPenalty',\n });\n }\n if (options.presencePenalty != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'presencePenalty',\n });\n }\n if (options.seed != null) {\n warnings.push({ type: 'unsupported-setting', setting: 'seed' });\n }\n\n let tools = options.tools;\n let toolChoice = options.toolChoice;\n\n if (toolChoice?.type === 'none') {\n tools = undefined;\n toolChoice = undefined;\n } else if (toolChoice != null && toolChoice.type !== 'auto') {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'toolChoice',\n details: 'Z.AI currently supports only automatic tool selection.',\n });\n toolChoice = undefined;\n }\n\n const normalizedOptions: LanguageModelV2CallOptions = {\n ...options,\n frequencyPenalty: undefined,\n presencePenalty: undefined,\n seed: undefined,\n tools,\n toolChoice,\n providerOptions:\n zaiOptions == null\n ? options.providerOptions\n : {\n ...options.providerOptions,\n zai: zaiOptions,\n },\n };\n\n return { normalizedOptions, warnings };\n }\n\n async doGenerate(\n options: Parameters<LanguageModelV2['doGenerate']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {\n const { normalizedOptions, warnings } =\n await this.prepareCallOptions(options);\n const result = await super.doGenerate(normalizedOptions);\n\n return {\n ...result,\n finishReason: mapZaiFinishReason(\n result.finishReason,\n getRawFinishReason(result.response?.body),\n ),\n warnings: [...result.warnings, ...warnings],\n };\n }\n\n async doStream(\n options: Parameters<LanguageModelV2['doStream']>[0],\n ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {\n const originalIncludeRawChunks = options.includeRawChunks;\n const { normalizedOptions, warnings } =\n await this.prepareCallOptions(options);\n const result = await super.doStream({\n ...normalizedOptions,\n includeRawChunks: true,\n });\n\n let rawFinishReason: string | undefined;\n\n return {\n ...result,\n stream: result.stream.pipeThrough(\n new TransformStream<\n LanguageModelV2StreamPart,\n LanguageModelV2StreamPart\n >({\n transform(part, controller) {\n if (part.type === 'stream-start') {\n controller.enqueue({\n ...part,\n warnings: [...part.warnings, ...warnings],\n });\n return;\n }\n\n if (part.type === 'raw') {\n rawFinishReason =\n getRawFinishReason(part.rawValue) ?? rawFinishReason;\n if (originalIncludeRawChunks) {\n controller.enqueue(part);\n }\n return;\n }\n\n if (part.type === 'finish') {\n controller.enqueue({\n ...part,\n finishReason: mapZaiFinishReason(\n part.finishReason,\n rawFinishReason,\n ),\n });\n return;\n }\n\n controller.enqueue(part);\n },\n }),\n ),\n };\n }\n}\n","import { z } from 'zod/v4';\n\nexport const zaiLanguageModelChatOptions = z.object({\n /**\n * Enables or disables sampling. When disabled, temperature and topP do not\n * take effect.\n */\n doSample: z.boolean().optional(),\n\n /**\n * Controls model thinking and whether reasoning from earlier turns is kept.\n */\n thinking: z\n .object({\n type: z.enum(['enabled', 'disabled']).optional(),\n clearThinking: z.boolean().optional(),\n })\n .optional(),\n\n /**\n * Controls reasoning effort for GLM-5.2 and later models.\n */\n reasoningEffort: z\n .enum(['none', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'])\n .optional(),\n\n /**\n * Enables incremental function-call argument streaming on supported models.\n */\n toolStream: z.boolean().optional(),\n\n /**\n * A caller-provided request identifier between 6 and 64 characters.\n */\n requestId: z.string().min(6).max(64).optional(),\n\n /**\n * A non-sensitive end-user identifier between 6 and 128 characters.\n */\n userId: z.string().min(6).max(128).optional(),\n});\n\nexport type ZaiLanguageModelChatOptions = z.infer<\n typeof zaiLanguageModelChatOptions\n>;\n","import type { ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport { z } from 'zod/v4';\n\nconst zaiErrorDetailsSchema = z.object({\n code: z.union([z.number(), z.string()]).nullish(),\n message: z.string(),\n});\n\nconst zaiErrorSchema = z.union([\n zaiErrorDetailsSchema,\n z.object({ error: zaiErrorDetailsSchema }),\n]);\n\nexport type ZaiErrorData = z.infer<typeof zaiErrorSchema>;\n\nexport const zaiErrorStructure: ProviderErrorStructure<ZaiErrorData> = {\n errorSchema: zaiErrorSchema,\n errorToMessage: data => ('error' in data ? data.error.message : data.message),\n};\n"],"mappings":"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","names":["z"]}
|