@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 CHANGED
@@ -1,21 +1,19 @@
1
1
  # @ai-sdk/zai
2
2
 
3
- ## 1.0.1
3
+ ## 2.0.1
4
4
 
5
5
  ### Patch Changes
6
6
 
7
- - Updated dependencies [77d33c0]
8
- - @ai-sdk/provider-utils@3.0.35
9
- - @ai-sdk/openai-compatible@1.0.52
7
+ - Updated dependencies [9a521b9]
8
+ - @ai-sdk/provider-utils@4.0.49
9
+ - @ai-sdk/openai-compatible@2.0.73
10
10
 
11
- ## 1.0.0
11
+ ## 2.0.0
12
12
 
13
13
  ### Major Changes
14
14
 
15
- - 326a47b: feat(zai): add the Z.AI provider with GLM chat completions, streaming, reasoning, tools, and multimodal inputs
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
- - 326a47b: Backport: Add GLM-5.3-Flash model support to the Z.AI provider and AI Gateway.
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 { ProviderV2, LanguageModelV2 } from '@ai-sdk/provider';
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 ProviderV2 {
65
+ interface ZaiProvider extends ProviderV3 {
66
66
  /**
67
67
  * Creates a Z.AI chat model for text generation.
68
68
  */
69
- (modelId: ZaiChatModelId): LanguageModelV2;
69
+ (modelId: ZaiChatModelId): LanguageModelV3;
70
70
  /**
71
71
  * Creates a Z.AI language model.
72
72
  */
73
- languageModel(modelId: ZaiChatModelId): LanguageModelV2;
73
+ languageModel(modelId: ZaiChatModelId): LanguageModelV3;
74
74
  /**
75
75
  * Creates a Z.AI chat model.
76
76
  */
77
- chatModel(modelId: ZaiChatModelId): LanguageModelV2;
77
+ chatModel(modelId: ZaiChatModelId): LanguageModelV3;
78
78
  /**
79
79
  * Creates a Z.AI chat model.
80
80
  */
81
- chat(modelId: ZaiChatModelId): LanguageModelV2;
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
- var import_provider = require("@ai-sdk/provider");
31
- var import_provider_utils2 = require("@ai-sdk/provider-utils");
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 ? "1.0.1" : "0.0.0-test";
12
+ var VERSION = true ? "2.0.1" : "0.0.0-test";
35
13
 
36
14
  // src/zai-chat-language-model.ts
37
- var import_openai_compatible = require("@ai-sdk/openai-compatible");
38
- var import_provider_utils = require("@ai-sdk/provider-utils");
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
- var import_v4 = require("zod/v4");
42
- var zaiLanguageModelChatOptions = import_v4.z.object({
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: import_v4.z.boolean().optional(),
27
+ doSample: z.boolean().optional(),
48
28
  /**
49
29
  * Controls model thinking and whether reasoning from earlier turns is kept.
50
30
  */
51
- thinking: import_v4.z.object({
52
- type: import_v4.z.enum(["enabled", "disabled"]).optional(),
53
- clearThinking: import_v4.z.boolean().optional()
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: import_v4.z.enum(["none", "minimal", "low", "medium", "high", "xhigh", "max"]).optional(),
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: import_v4.z.boolean().optional(),
42
+ toolStream: z.boolean().optional(),
63
43
  /**
64
44
  * A caller-provided request identifier between 6 and 64 characters.
65
45
  */
66
- requestId: import_v4.z.string().min(6).max(64).optional(),
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: import_v4.z.string().min(6).max(128).optional()
50
+ userId: z.string().min(6).max(128).optional()
71
51
  });
72
52
 
73
53
  // src/zai-error.ts
74
- var import_v42 = require("zod/v4");
75
- var zaiErrorDetailsSchema = import_v42.z.object({
76
- code: import_v42.z.union([import_v42.z.number(), import_v42.z.string()]).nullish(),
77
- message: import_v42.z.string()
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 = import_v42.z.union([
59
+ var zaiErrorSchema = z2.union([
80
60
  zaiErrorDetailsSchema,
81
- import_v42.z.object({ error: zaiErrorDetailsSchema })
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, rawFinishReason) {
120
- switch (rawFinishReason) {
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
- function getRawFinishReason(responseBody) {
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 (0, import_provider_utils.parseProviderOptions)({
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-setting", setting: "seed" });
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-setting",
192
- setting: "toolChoice",
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 = (0, import_provider_utils2.withoutTrailingSlash)(options.baseURL)) != null ? _a : "https://api.z.ai/api/paas/v4";
274
- const getHeaders = () => (0, import_provider_utils2.withUserAgentSuffix)(
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 ${(0, import_provider_utils2.loadApiKey)({
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 = "v2";
231
+ provider.specificationVersion = "v3";
293
232
  provider.languageModel = createLanguageModel;
294
233
  provider.chatModel = createLanguageModel;
295
234
  provider.chat = createLanguageModel;
296
- provider.textEmbeddingModel = (modelId) => {
297
- throw new import_provider.NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
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 import_provider.NoSuchModelError({ modelId, modelType: "imageModel" });
240
+ throw new NoSuchModelError({ modelId, modelType: "imageModel" });
301
241
  };
302
242
  return provider;
303
243
  }
304
244
  var zai = createZai();
305
- // Annotate the CommonJS export names for ESM import in node:
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": "1.0.1",
4
- "type": "commonjs",
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.mjs",
29
- "require": "./dist/index.js"
27
+ "import": "./dist/index.js",
28
+ "default": "./dist/index.js"
30
29
  }
31
30
  },
32
31
  "dependencies": {
33
- "@ai-sdk/openai-compatible": "1.0.52",
34
- "@ai-sdk/provider": "2.0.3",
35
- "@ai-sdk/provider-utils": "3.0.35"
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
- LanguageModelV2,
4
- LanguageModelV2CallOptions,
5
- LanguageModelV2CallWarning,
6
- LanguageModelV2FinishReason,
7
- LanguageModelV2StreamPart,
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: LanguageModelV2FinishReason,
62
- rawFinishReason: string | undefined,
63
- ): LanguageModelV2FinishReason {
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 LanguageModelV2
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: LanguageModelV2CallOptions) {
122
- const warnings: LanguageModelV2CallWarning[] = [];
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-setting', setting: 'seed' });
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-setting',
155
- setting: 'toolChoice',
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: LanguageModelV2CallOptions = {
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: Parameters<LanguageModelV2['doGenerate']>[0],
182
- ): Promise<Awaited<ReturnType<LanguageModelV2['doGenerate']>>> {
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: Parameters<LanguageModelV2['doStream']>[0],
199
- ): Promise<Awaited<ReturnType<LanguageModelV2['doStream']>>> {
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
- LanguageModelV2StreamPart,
215
- LanguageModelV2StreamPart
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
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  NoSuchModelError,
3
- type LanguageModelV2,
4
- type ProviderV2,
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 ProviderV2 {
39
+ export interface ZaiProvider extends ProviderV3 {
40
40
  /**
41
41
  * Creates a Z.AI chat model for text generation.
42
42
  */
43
- (modelId: ZaiChatModelId): LanguageModelV2;
43
+ (modelId: ZaiChatModelId): LanguageModelV3;
44
44
 
45
45
  /**
46
46
  * Creates a Z.AI language model.
47
47
  */
48
- languageModel(modelId: ZaiChatModelId): LanguageModelV2;
48
+ languageModel(modelId: ZaiChatModelId): LanguageModelV3;
49
49
 
50
50
  /**
51
51
  * Creates a Z.AI chat model.
52
52
  */
53
- chatModel(modelId: ZaiChatModelId): LanguageModelV2;
53
+ chatModel(modelId: ZaiChatModelId): LanguageModelV3;
54
54
 
55
55
  /**
56
56
  * Creates a Z.AI chat model.
57
57
  */
58
- chat(modelId: ZaiChatModelId): LanguageModelV2;
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 = 'v2' as const;
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.textEmbeddingModel = (modelId: string) => {
94
- throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });
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
@@ -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"]}