@ai-sdk/zai 2.0.0 → 3.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,11 +1,19 @@
1
1
  # @ai-sdk/zai
2
2
 
3
- ## 2.0.0
3
+ ## 3.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [3e125ba]
8
+ - @ai-sdk/provider-utils@5.0.32
9
+ - @ai-sdk/openai-compatible@3.0.39
10
+
11
+ ## 3.0.0
4
12
 
5
13
  ### Major Changes
6
14
 
7
- - 5604dde: feat(zai): add the Z.AI provider with GLM chat completions, streaming, reasoning, tools, and multimodal inputs
15
+ - b580642: feat(zai): add the Z.AI provider with GLM chat completions, streaming, reasoning, tools, and multimodal inputs
8
16
 
9
17
  ### Patch Changes
10
18
 
11
- - ad28ecb: Backport: Add GLM-5.3-Flash model support to the Z.AI provider and AI Gateway.
19
+ - 81bebaf: 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 { ProviderV3, LanguageModelV3 } from '@ai-sdk/provider';
2
+ import { ProviderV4, LanguageModelV4 } 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,19 @@ interface ZaiProviderSettings {
62
62
  */
63
63
  fetch?: FetchFunction;
64
64
  }
65
- interface ZaiProvider extends ProviderV3 {
65
+ interface ZaiProvider extends ProviderV4 {
66
66
  /**
67
67
  * Creates a Z.AI chat model for text generation.
68
68
  */
69
- (modelId: ZaiChatModelId): LanguageModelV3;
69
+ (modelId: ZaiChatModelId): LanguageModelV4;
70
70
  /**
71
71
  * Creates a Z.AI language model.
72
72
  */
73
- languageModel(modelId: ZaiChatModelId): LanguageModelV3;
73
+ languageModel(modelId: ZaiChatModelId): LanguageModelV4;
74
74
  /**
75
75
  * Creates a Z.AI chat model.
76
76
  */
77
- chatModel(modelId: ZaiChatModelId): LanguageModelV3;
78
- /**
79
- * Creates a Z.AI chat model.
80
- */
81
- chat(modelId: ZaiChatModelId): LanguageModelV3;
77
+ chat(modelId: ZaiChatModelId): LanguageModelV4;
82
78
  /**
83
79
  * @deprecated Use `embeddingModel` instead.
84
80
  */
package/dist/index.js CHANGED
@@ -9,12 +9,15 @@ import {
9
9
  } from "@ai-sdk/provider-utils";
10
10
 
11
11
  // src/version.ts
12
- var VERSION = true ? "2.0.0" : "0.0.0-test";
12
+ var VERSION = true ? "3.0.1" : "0.0.0-test";
13
13
 
14
14
  // src/zai-chat-language-model.ts
15
15
  import { OpenAICompatibleChatLanguageModel } from "@ai-sdk/openai-compatible";
16
16
  import {
17
- parseProviderOptions
17
+ parseProviderOptions,
18
+ serializeModelOptions,
19
+ WORKFLOW_DESERIALIZE,
20
+ WORKFLOW_SERIALIZE
18
21
  } from "@ai-sdk/provider-utils";
19
22
 
20
23
  // src/zai-chat-language-model-options.ts
@@ -108,13 +111,25 @@ function mapZaiFinishReason(finishReason) {
108
111
  return finishReason;
109
112
  }
110
113
  }
111
- var ZaiChatLanguageModel = class extends OpenAICompatibleChatLanguageModel {
114
+ var ZaiChatLanguageModel = class _ZaiChatLanguageModel extends OpenAICompatibleChatLanguageModel {
115
+ static [WORKFLOW_SERIALIZE](model) {
116
+ return serializeModelOptions({
117
+ modelId: model.modelId,
118
+ config: model.zaiConfig
119
+ });
120
+ }
121
+ static [WORKFLOW_DESERIALIZE](options) {
122
+ return new _ZaiChatLanguageModel(
123
+ options.modelId,
124
+ options.config
125
+ );
126
+ }
112
127
  constructor(modelId, config) {
113
128
  const headers = config.headers;
114
129
  super(modelId, {
115
130
  provider: config.provider,
116
131
  url: ({ path }) => `${config.baseURL}${path}`,
117
- headers: () => headers == null ? {} : typeof headers === "function" ? headers() : headers,
132
+ headers: headers == null ? void 0 : () => typeof headers === "function" ? headers() : headers,
118
133
  fetch: config.fetch,
119
134
  errorStructure: zaiErrorStructure,
120
135
  transformRequestBody: transformZaiRequestBody,
@@ -123,6 +138,7 @@ var ZaiChatLanguageModel = class extends OpenAICompatibleChatLanguageModel {
123
138
  "video/*": [/^https?:\/\//]
124
139
  })
125
140
  });
141
+ this.zaiConfig = config;
126
142
  }
127
143
  async prepareCallOptions(options) {
128
144
  const warnings = [];
@@ -228,9 +244,8 @@ function createZai(options = {}) {
228
244
  fetch: options.fetch
229
245
  });
230
246
  const provider = (modelId) => createLanguageModel(modelId);
231
- provider.specificationVersion = "v3";
247
+ provider.specificationVersion = "v4";
232
248
  provider.languageModel = createLanguageModel;
233
- provider.chatModel = createLanguageModel;
234
249
  provider.chat = createLanguageModel;
235
250
  provider.embeddingModel = (modelId) => {
236
251
  throw new NoSuchModelError({ modelId, modelType: "embeddingModel" });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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":";AAAA;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;;;ACRA,IAAM,UACX,OACI,UACA;;;ACLN,SAAS,yCAAyC;AAUlD;AAAA,EACE;AAAA,OAEK;;;ACbP,SAAS,SAAS;AAEX,IAAM,8BAA8B,EAAE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlD,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAK/B,UAAU,EACP,OAAO;AAAA,IACN,MAAM,EAAE,KAAK,CAAC,WAAW,UAAU,CAAC,EAAE,SAAS;AAAA,IAC/C,eAAe,EAAE,QAAQ,EAAE,SAAS;AAAA,EACtC,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA,EAKZ,iBAAiB,EACd,KAAK,CAAC,QAAQ,WAAW,OAAO,UAAU,QAAQ,SAAS,KAAK,CAAC,EACjE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKZ,YAAY,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKjC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAK9C,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAC9C,CAAC;;;ACvCD,SAAS,KAAAA,UAAS;AAElB,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EACrC,MAAMA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,CAAC,EAAE,QAAQ;AAAA,EAChD,SAASA,GAAE,OAAO;AACpB,CAAC;AAED,IAAM,iBAAiBA,GAAE,MAAM;AAAA,EAC7B;AAAA,EACAA,GAAE,OAAO,EAAE,OAAO,sBAAsB,CAAC;AAC3C,CAAC;AAIM,IAAM,oBAA0D;AAAA,EACrE,aAAa;AAAA,EACb,gBAAgB,UAAS,WAAW,OAAO,KAAK,MAAM,UAAU,KAAK;AACvE;;;AFSA,SAAS,wBACP,MACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,WAAW;AAAA,IACX,GAAG;AAAA,EACL,IAAI;AAEJ,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,aAAa,UAAa,EAAE,WAAW,SAAS;AAAA,IACpD,GAAI,aAAa,UAAa;AAAA,MAC5B,UAAU;AAAA,QACR,GAAI,SAAS,SAAS,UAAa,EAAE,MAAM,SAAS,KAAK;AAAA,QACzD,GAAI,SAAS,kBAAkB,UAAa;AAAA,UAC1C,gBAAgB,SAAS;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IACA,GAAI,eAAe,UAAa,EAAE,aAAa,WAAW;AAAA,IAC1D,GAAI,cAAc,UAAa,EAAE,YAAY,UAAU;AAAA,IACvD,GAAI,WAAW,UAAa,EAAE,SAAS,OAAO;AAAA,EAChD;AACF;AAEA,SAAS,mBACP,cAC6B;AAC7B,UAAQ,aAAa,KAAK;AAAA,IACxB,KAAK;AACH,aAAO,EAAE,SAAS,kBAAkB,KAAK,aAAa,IAAI;AAAA,IAC5D,KAAK;AACH,aAAO,EAAE,SAAS,UAAU,KAAK,aAAa,IAAI;AAAA,IACpD,KAAK;AACH,aAAO,EAAE,SAAS,SAAS,KAAK,aAAa,IAAI;AAAA,IACnD;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,uBAAN,cACG,kCAEV;AAAA,EACE,YAAY,SAAyB,QAAuB;AAC1D,UAAM,UAAU,OAAO;AAEvB,UAAM,SAAS;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,OAAO,GAAG,IAAI;AAAA,MAC3C,SAAS,MACP,WAAW,OACP,CAAC,IACD,OAAO,YAAY,aACjB,QAAQ,IACR;AAAA,MACR,OAAO,OAAO;AAAA,MACd,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,MACtB,eAAe,OAAO;AAAA,QACpB,WAAW,CAAC,cAAc;AAAA,QAC1B,WAAW,CAAC,cAAc;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,mBAAmB,SAAqC;AACpE,UAAM,WAA8B,CAAC;AAErC,UAAM,aAAa,MAAM,qBAAqB;AAAA,MAC5C,UAAU;AAAA,MACV,iBAAiB,QAAQ;AAAA,MACzB,QAAQ;AAAA,IACV,CAAC;AAED,QAAI,QAAQ,oBAAoB,MAAM;AACpC,eAAS,KAAK,EAAE,MAAM,eAAe,SAAS,mBAAmB,CAAC;AAAA,IACpE;AACA,QAAI,QAAQ,mBAAmB,MAAM;AACnC,eAAS,KAAK,EAAE,MAAM,eAAe,SAAS,kBAAkB,CAAC;AAAA,IACnE;AACA,QAAI,QAAQ,QAAQ,MAAM;AACxB,eAAS,KAAK,EAAE,MAAM,eAAe,SAAS,OAAO,CAAC;AAAA,IACxD;AAEA,QAAI,QAAQ,QAAQ;AACpB,QAAI,aAAa,QAAQ;AAEzB,SAAI,yCAAY,UAAS,QAAQ;AAC/B,cAAQ;AACR,mBAAa;AAAA,IACf,WAAW,cAAc,QAAQ,WAAW,SAAS,QAAQ;AAC3D,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,cAAc,WAAW,IAAI;AAAA,QACtC,SAAS;AAAA,MACX,CAAC;AACD,mBAAa;AAAA,IACf;AAEA,UAAM,oBAAgD;AAAA,MACpD,GAAG;AAAA,MACH,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,iBACE,cAAc,OACV,QAAQ,kBACR;AAAA,QACE,GAAG,QAAQ;AAAA,QACX,KAAK;AAAA,MACP;AAAA,IACR;AAEA,WAAO,EAAE,mBAAmB,SAAS;AAAA,EACvC;AAAA,EAEA,MAAM,WACJ,SACwC;AACxC,UAAM,EAAE,mBAAmB,SAAS,IAClC,MAAM,KAAK,mBAAmB,OAAO;AACvC,UAAM,SAAS,MAAM,MAAM,WAAW,iBAAiB;AAEvD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,cAAc,mBAAmB,OAAO,YAAY;AAAA,MACpD,UAAU,CAAC,GAAG,OAAO,UAAU,GAAG,QAAQ;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,SACsC;AACtC,UAAM,EAAE,mBAAmB,SAAS,IAClC,MAAM,KAAK,mBAAmB,OAAO;AACvC,UAAM,SAAS,MAAM,MAAM,SAAS,iBAAiB;AAErD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,OAAO,OAAO;AAAA,QACpB,IAAI,gBAGF;AAAA,UACA,UAAU,MAAM,YAAY;AAC1B,gBAAI,KAAK,SAAS,gBAAgB;AAChC,yBAAW,QAAQ;AAAA,gBACjB,GAAG;AAAA,gBACH,UAAU,CAAC,GAAG,KAAK,UAAU,GAAG,QAAQ;AAAA,cAC1C,CAAC;AACD;AAAA,YACF;AAEA,gBAAI,KAAK,SAAS,UAAU;AAC1B,yBAAW,QAAQ;AAAA,gBACjB,GAAG;AAAA,gBACH,cAAc,mBAAmB,KAAK,YAAY;AAAA,cACpD,CAAC;AACD;AAAA,YACF;AAEA,uBAAW,QAAQ,IAAI;AAAA,UACzB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AF7IO,SAAS,UAAU,UAA+B,CAAC,GAAgB;AAjE1E;AAkEE,QAAM,WACJ,0BAAqB,QAAQ,OAAO,MAApC,YAAyC;AAE3C,QAAM,aAAa,MACjB;AAAA,IACE;AAAA,MACE,eAAe,UAAU,WAAW;AAAA,QAClC,QAAQ,QAAQ;AAAA,QAChB,yBAAyB;AAAA,QACzB,aAAa;AAAA,MACf,CAAC,CAAC;AAAA,MACF,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,cAAc,OAAO;AAAA,EACvB;AAEF,QAAM,sBAAsB,CAAC,YAC3B,IAAI,qBAAqB,SAAS;AAAA,IAChC,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAEH,QAAM,WAAW,CAAC,YAA4B,oBAAoB,OAAO;AAEzE,WAAS,uBAAuB;AAChC,WAAS,gBAAgB;AACzB,WAAS,YAAY;AACrB,WAAS,OAAO;AAEhB,WAAS,iBAAiB,CAAC,YAAoB;AAC7C,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,iBAAiB,CAAC;AAAA,EACrE;AACA,WAAS,qBAAqB,SAAS;AACvC,WAAS,aAAa,CAAC,YAAoB;AACzC,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,aAAa,CAAC;AAAA,EACjE;AAEA,SAAO;AACT;AAEO,IAAM,MAAM,UAAU;","names":["z"]}
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 LanguageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { 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 ProviderV4 {\n /**\n * Creates a Z.AI chat model for text generation.\n */\n (modelId: ZaiChatModelId): LanguageModelV4;\n\n /**\n * Creates a Z.AI language model.\n */\n languageModel(modelId: ZaiChatModelId): LanguageModelV4;\n\n /**\n * Creates a Z.AI chat model.\n */\n chat(modelId: ZaiChatModelId): LanguageModelV4;\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 = 'v4' as const;\n provider.languageModel = 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 LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4FinishReason,\n LanguageModelV4GenerateResult,\n LanguageModelV4StreamPart,\n LanguageModelV4StreamResult,\n SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n parseProviderOptions,\n serializeModelOptions,\n WORKFLOW_DESERIALIZE,\n WORKFLOW_SERIALIZE,\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\ntype OpenAICompatibleChatConfig = ConstructorParameters<\n typeof OpenAICompatibleChatLanguageModel\n>[1];\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: LanguageModelV4FinishReason,\n): LanguageModelV4FinishReason {\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 LanguageModelV4\n{\n private readonly zaiConfig: ZaiChatConfig;\n\n static [WORKFLOW_SERIALIZE](model: ZaiChatLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.zaiConfig,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: string;\n config: OpenAICompatibleChatConfig;\n }) {\n return new ZaiChatLanguageModel(\n options.modelId,\n options.config as unknown as ZaiChatConfig,\n );\n }\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 ? undefined\n : () => (typeof headers === 'function' ? headers() : headers),\n fetch: config.fetch,\n errorStructure: zaiErrorStructure,\n transformRequestBody: transformZaiRequestBody,\n supportedUrls: () => ({\n 'image/*': [/^https?:\\/\\//],\n 'video/*': [/^https?:\\/\\//],\n }),\n });\n\n this.zaiConfig = config;\n }\n\n private async prepareCallOptions(options: LanguageModelV4CallOptions) {\n const warnings: SharedV4Warning[] = [];\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: LanguageModelV4CallOptions = {\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: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\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: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\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 LanguageModelV4StreamPart,\n LanguageModelV4StreamPart\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,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/zai",
3
- "version": "2.0.0",
3
+ "version": "3.0.1",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "sideEffects": false,
@@ -29,22 +29,22 @@
29
29
  }
30
30
  },
31
31
  "dependencies": {
32
- "@ai-sdk/openai-compatible": "2.0.72",
33
- "@ai-sdk/provider": "3.0.15",
34
- "@ai-sdk/provider-utils": "4.0.48"
32
+ "@ai-sdk/openai-compatible": "3.0.39",
33
+ "@ai-sdk/provider": "4.0.8",
34
+ "@ai-sdk/provider-utils": "5.0.32"
35
35
  },
36
36
  "devDependencies": {
37
- "@types/node": "20.17.24",
38
- "tsup": "^8",
37
+ "@types/node": "22.19.19",
38
+ "@vercel/ai-tsconfig": "0.0.0",
39
+ "tsup": "^8.5.1",
39
40
  "typescript": "5.8.3",
40
- "zod": "3.25.76",
41
- "@vercel/ai-tsconfig": "0.0.0"
41
+ "zod": "3.25.76"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "zod": "^3.25.76 || ^4.1.8"
45
45
  },
46
46
  "engines": {
47
- "node": ">=18"
47
+ "node": ">=22"
48
48
  },
49
49
  "publishConfig": {
50
50
  "access": "public",
@@ -1,21 +1,28 @@
1
1
  import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';
2
2
  import type {
3
- LanguageModelV3,
4
- LanguageModelV3CallOptions,
5
- LanguageModelV3FinishReason,
6
- LanguageModelV3GenerateResult,
7
- LanguageModelV3StreamPart,
8
- LanguageModelV3StreamResult,
9
- SharedV3Warning,
3
+ LanguageModelV4,
4
+ LanguageModelV4CallOptions,
5
+ LanguageModelV4FinishReason,
6
+ LanguageModelV4GenerateResult,
7
+ LanguageModelV4StreamPart,
8
+ LanguageModelV4StreamResult,
9
+ SharedV4Warning,
10
10
  } from '@ai-sdk/provider';
11
11
  import {
12
12
  parseProviderOptions,
13
+ serializeModelOptions,
14
+ WORKFLOW_DESERIALIZE,
15
+ WORKFLOW_SERIALIZE,
13
16
  type FetchFunction,
14
17
  } from '@ai-sdk/provider-utils';
15
18
  import type { ZaiChatModelId } from './zai-chat-options';
16
19
  import { zaiLanguageModelChatOptions } from './zai-chat-language-model-options';
17
20
  import { zaiErrorStructure } from './zai-error';
18
21
 
22
+ type OpenAICompatibleChatConfig = ConstructorParameters<
23
+ typeof OpenAICompatibleChatLanguageModel
24
+ >[1];
25
+
19
26
  export type ZaiChatConfig = {
20
27
  provider: string;
21
28
  baseURL: string;
@@ -60,8 +67,8 @@ function transformZaiRequestBody(
60
67
  }
61
68
 
62
69
  function mapZaiFinishReason(
63
- finishReason: LanguageModelV3FinishReason,
64
- ): LanguageModelV3FinishReason {
70
+ finishReason: LanguageModelV4FinishReason,
71
+ ): LanguageModelV4FinishReason {
65
72
  switch (finishReason.raw) {
66
73
  case 'sensitive':
67
74
  return { unified: 'content-filter', raw: finishReason.raw };
@@ -76,20 +83,37 @@ function mapZaiFinishReason(
76
83
 
77
84
  export class ZaiChatLanguageModel
78
85
  extends OpenAICompatibleChatLanguageModel
79
- implements LanguageModelV3
86
+ implements LanguageModelV4
80
87
  {
88
+ private readonly zaiConfig: ZaiChatConfig;
89
+
90
+ static [WORKFLOW_SERIALIZE](model: ZaiChatLanguageModel) {
91
+ return serializeModelOptions({
92
+ modelId: model.modelId,
93
+ config: model.zaiConfig,
94
+ });
95
+ }
96
+
97
+ static [WORKFLOW_DESERIALIZE](options: {
98
+ modelId: string;
99
+ config: OpenAICompatibleChatConfig;
100
+ }) {
101
+ return new ZaiChatLanguageModel(
102
+ options.modelId,
103
+ options.config as unknown as ZaiChatConfig,
104
+ );
105
+ }
106
+
81
107
  constructor(modelId: ZaiChatModelId, config: ZaiChatConfig) {
82
108
  const headers = config.headers;
83
109
 
84
110
  super(modelId, {
85
111
  provider: config.provider,
86
112
  url: ({ path }) => `${config.baseURL}${path}`,
87
- headers: () =>
113
+ headers:
88
114
  headers == null
89
- ? {}
90
- : typeof headers === 'function'
91
- ? headers()
92
- : headers,
115
+ ? undefined
116
+ : () => (typeof headers === 'function' ? headers() : headers),
93
117
  fetch: config.fetch,
94
118
  errorStructure: zaiErrorStructure,
95
119
  transformRequestBody: transformZaiRequestBody,
@@ -98,10 +122,12 @@ export class ZaiChatLanguageModel
98
122
  'video/*': [/^https?:\/\//],
99
123
  }),
100
124
  });
125
+
126
+ this.zaiConfig = config;
101
127
  }
102
128
 
103
- private async prepareCallOptions(options: LanguageModelV3CallOptions) {
104
- const warnings: SharedV3Warning[] = [];
129
+ private async prepareCallOptions(options: LanguageModelV4CallOptions) {
130
+ const warnings: SharedV4Warning[] = [];
105
131
 
106
132
  const zaiOptions = await parseProviderOptions({
107
133
  provider: 'zai',
@@ -134,7 +160,7 @@ export class ZaiChatLanguageModel
134
160
  toolChoice = undefined;
135
161
  }
136
162
 
137
- const normalizedOptions: LanguageModelV3CallOptions = {
163
+ const normalizedOptions: LanguageModelV4CallOptions = {
138
164
  ...options,
139
165
  frequencyPenalty: undefined,
140
166
  presencePenalty: undefined,
@@ -154,8 +180,8 @@ export class ZaiChatLanguageModel
154
180
  }
155
181
 
156
182
  async doGenerate(
157
- options: LanguageModelV3CallOptions,
158
- ): Promise<LanguageModelV3GenerateResult> {
183
+ options: LanguageModelV4CallOptions,
184
+ ): Promise<LanguageModelV4GenerateResult> {
159
185
  const { normalizedOptions, warnings } =
160
186
  await this.prepareCallOptions(options);
161
187
  const result = await super.doGenerate(normalizedOptions);
@@ -168,8 +194,8 @@ export class ZaiChatLanguageModel
168
194
  }
169
195
 
170
196
  async doStream(
171
- options: LanguageModelV3CallOptions,
172
- ): Promise<LanguageModelV3StreamResult> {
197
+ options: LanguageModelV4CallOptions,
198
+ ): Promise<LanguageModelV4StreamResult> {
173
199
  const { normalizedOptions, warnings } =
174
200
  await this.prepareCallOptions(options);
175
201
  const result = await super.doStream(normalizedOptions);
@@ -178,8 +204,8 @@ export class ZaiChatLanguageModel
178
204
  ...result,
179
205
  stream: result.stream.pipeThrough(
180
206
  new TransformStream<
181
- LanguageModelV3StreamPart,
182
- LanguageModelV3StreamPart
207
+ LanguageModelV4StreamPart,
208
+ LanguageModelV4StreamPart
183
209
  >({
184
210
  transform(part, controller) {
185
211
  if (part.type === 'stream-start') {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  NoSuchModelError,
3
- type LanguageModelV3,
4
- type ProviderV3,
3
+ type LanguageModelV4,
4
+ type ProviderV4,
5
5
  } from '@ai-sdk/provider';
6
6
  import {
7
7
  loadApiKey,
@@ -36,26 +36,21 @@ export interface ZaiProviderSettings {
36
36
  fetch?: FetchFunction;
37
37
  }
38
38
 
39
- export interface ZaiProvider extends ProviderV3 {
39
+ export interface ZaiProvider extends ProviderV4 {
40
40
  /**
41
41
  * Creates a Z.AI chat model for text generation.
42
42
  */
43
- (modelId: ZaiChatModelId): LanguageModelV3;
43
+ (modelId: ZaiChatModelId): LanguageModelV4;
44
44
 
45
45
  /**
46
46
  * Creates a Z.AI language model.
47
47
  */
48
- languageModel(modelId: ZaiChatModelId): LanguageModelV3;
48
+ languageModel(modelId: ZaiChatModelId): LanguageModelV4;
49
49
 
50
50
  /**
51
51
  * Creates a Z.AI chat model.
52
52
  */
53
- chatModel(modelId: ZaiChatModelId): LanguageModelV3;
54
-
55
- /**
56
- * Creates a Z.AI chat model.
57
- */
58
- chat(modelId: ZaiChatModelId): LanguageModelV3;
53
+ chat(modelId: ZaiChatModelId): LanguageModelV4;
59
54
 
60
55
  /**
61
56
  * @deprecated Use `embeddingModel` instead.
@@ -90,9 +85,8 @@ export function createZai(options: ZaiProviderSettings = {}): ZaiProvider {
90
85
 
91
86
  const provider = (modelId: ZaiChatModelId) => createLanguageModel(modelId);
92
87
 
93
- provider.specificationVersion = 'v3' as const;
88
+ provider.specificationVersion = 'v4' as const;
94
89
  provider.languageModel = createLanguageModel;
95
- provider.chatModel = createLanguageModel;
96
90
  provider.chat = createLanguageModel;
97
91
 
98
92
  provider.embeddingModel = (modelId: string) => {