@ai-sdk/cerebras 3.0.0-beta.4 → 3.0.0-beta.57

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/dist/index.js CHANGED
@@ -1,59 +1,137 @@
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 });
1
+ // src/cerebras-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/cerebras-chat-language-model.ts
12
+ import { OpenAICompatibleChatLanguageModel } from "@ai-sdk/openai-compatible";
13
+ import {
14
+ serializeModelOptions,
15
+ WORKFLOW_DESERIALIZE,
16
+ WORKFLOW_SERIALIZE
17
+ } from "@ai-sdk/provider-utils";
18
+ function isStructuredOutputWithToolCallsFinishReason({
19
+ rawFinishReason,
20
+ hasText,
21
+ responseFormatType
22
+ }) {
23
+ return responseFormatType === "json" && rawFinishReason === "tool_calls" && hasText;
24
+ }
25
+ var CerebrasChatLanguageModel = class _CerebrasChatLanguageModel extends OpenAICompatibleChatLanguageModel {
26
+ static [WORKFLOW_SERIALIZE](model) {
27
+ return serializeModelOptions({
28
+ modelId: model.modelId,
29
+ config: model.config
30
+ });
31
+ }
32
+ static [WORKFLOW_DESERIALIZE](options) {
33
+ return new _CerebrasChatLanguageModel(options.modelId, options.config);
34
+ }
35
+ async doGenerate(options) {
36
+ var _a;
37
+ const result = await super.doGenerate(options);
38
+ if (!isStructuredOutputWithToolCallsFinishReason({
39
+ rawFinishReason: result.finishReason.raw,
40
+ hasText: result.content.some(
41
+ (part) => part.type === "text" && part.text.length > 0
42
+ ),
43
+ responseFormatType: (_a = options.responseFormat) == null ? void 0 : _a.type
44
+ })) {
45
+ return result;
46
+ }
47
+ return {
48
+ ...result,
49
+ // Cerebras GLM can return valid structured output text while also
50
+ // repeating a tool call. Treat that mixed response as the final answer.
51
+ content: result.content.filter((part) => part.type !== "tool-call"),
52
+ finishReason: {
53
+ ...result.finishReason,
54
+ unified: "stop"
55
+ }
56
+ };
57
+ }
58
+ async doStream(options) {
59
+ const result = await super.doStream(options);
60
+ let hasText = false;
61
+ return {
62
+ ...result,
63
+ stream: result.stream.pipeThrough(
64
+ new TransformStream({
65
+ transform(part, controller) {
66
+ var _a, _b;
67
+ if (part.type === "text-delta" && part.delta.length > 0) {
68
+ hasText = true;
69
+ }
70
+ if (part.type === "finish" && isStructuredOutputWithToolCallsFinishReason({
71
+ rawFinishReason: part.finishReason.raw,
72
+ hasText,
73
+ responseFormatType: (_a = options.responseFormat) == null ? void 0 : _a.type
74
+ })) {
75
+ controller.enqueue({
76
+ ...part,
77
+ finishReason: {
78
+ ...part.finishReason,
79
+ unified: "stop"
80
+ }
81
+ });
82
+ return;
83
+ }
84
+ if (((_b = options.responseFormat) == null ? void 0 : _b.type) === "json" && hasText && (part.type === "tool-input-start" || part.type === "tool-input-delta" || part.type === "tool-input-end" || part.type === "tool-call")) {
85
+ return;
86
+ }
87
+ controller.enqueue(part);
88
+ }
89
+ })
90
+ )
91
+ };
15
92
  }
16
- return to;
17
93
  };
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
- cerebras: () => cerebras,
25
- createCerebras: () => createCerebras
26
- });
27
- module.exports = __toCommonJS(index_exports);
28
94
 
29
95
  // src/cerebras-provider.ts
30
- var import_openai_compatible = require("@ai-sdk/openai-compatible");
31
- var import_provider = require("@ai-sdk/provider");
32
- var import_provider_utils = require("@ai-sdk/provider-utils");
33
- var import_v4 = require("zod/v4");
96
+ import { z } from "zod/v4";
34
97
 
35
98
  // src/version.ts
36
- var VERSION = true ? "3.0.0-beta.4" : "0.0.0-test";
99
+ var VERSION = true ? "3.0.0-beta.57" : "0.0.0-test";
37
100
 
38
101
  // src/cerebras-provider.ts
39
- var cerebrasErrorSchema = import_v4.z.object({
40
- message: import_v4.z.string(),
41
- type: import_v4.z.string(),
42
- param: import_v4.z.string(),
43
- code: import_v4.z.string()
102
+ var cerebrasErrorSchema = z.object({
103
+ message: z.string(),
104
+ type: z.string(),
105
+ param: z.string(),
106
+ code: z.string()
44
107
  });
45
108
  var cerebrasErrorStructure = {
46
109
  errorSchema: cerebrasErrorSchema,
47
110
  errorToMessage: (data) => data.message
48
111
  };
112
+ function transformCerebrasRequestBody(args) {
113
+ return {
114
+ ...args,
115
+ messages: Array.isArray(args.messages) ? args.messages.map((message) => {
116
+ if (message == null || typeof message !== "object" || message.role !== "assistant" || !("reasoning_content" in message)) {
117
+ return message;
118
+ }
119
+ const { reasoning_content, ...rest } = message;
120
+ return {
121
+ ...rest,
122
+ ...!("reasoning" in rest) && reasoning_content !== void 0 ? { reasoning: reasoning_content } : {}
123
+ };
124
+ }) : args.messages
125
+ };
126
+ }
49
127
  function createCerebras(options = {}) {
50
128
  var _a;
51
- const baseURL = (0, import_provider_utils.withoutTrailingSlash)(
129
+ const baseURL = withoutTrailingSlash(
52
130
  (_a = options.baseURL) != null ? _a : "https://api.cerebras.ai/v1"
53
131
  );
54
- const getHeaders = () => (0, import_provider_utils.withUserAgentSuffix)(
132
+ const getHeaders = () => withUserAgentSuffix(
55
133
  {
56
- Authorization: `Bearer ${(0, import_provider_utils.loadApiKey)({
134
+ Authorization: `Bearer ${loadApiKey({
57
135
  apiKey: options.apiKey,
58
136
  environmentVariableName: "CEREBRAS_API_KEY",
59
137
  description: "Cerebras API key"
@@ -63,13 +141,14 @@ function createCerebras(options = {}) {
63
141
  `ai-sdk/cerebras/${VERSION}`
64
142
  );
65
143
  const createLanguageModel = (modelId) => {
66
- return new import_openai_compatible.OpenAICompatibleChatLanguageModel(modelId, {
144
+ return new CerebrasChatLanguageModel(modelId, {
67
145
  provider: `cerebras.chat`,
68
146
  url: ({ path }) => `${baseURL}${path}`,
69
147
  headers: getHeaders,
70
148
  fetch: options.fetch,
71
149
  errorStructure: cerebrasErrorStructure,
72
- supportsStructuredOutputs: true
150
+ supportsStructuredOutputs: true,
151
+ transformRequestBody: transformCerebrasRequestBody
73
152
  });
74
153
  };
75
154
  const provider = (modelId) => createLanguageModel(modelId);
@@ -77,19 +156,18 @@ function createCerebras(options = {}) {
77
156
  provider.languageModel = createLanguageModel;
78
157
  provider.chat = createLanguageModel;
79
158
  provider.embeddingModel = (modelId) => {
80
- throw new import_provider.NoSuchModelError({ modelId, modelType: "embeddingModel" });
159
+ throw new NoSuchModelError({ modelId, modelType: "embeddingModel" });
81
160
  };
82
161
  provider.textEmbeddingModel = provider.embeddingModel;
83
162
  provider.imageModel = (modelId) => {
84
- throw new import_provider.NoSuchModelError({ modelId, modelType: "imageModel" });
163
+ throw new NoSuchModelError({ modelId, modelType: "imageModel" });
85
164
  };
86
165
  return provider;
87
166
  }
88
167
  var cerebras = createCerebras();
89
- // Annotate the CommonJS export names for ESM import in node:
90
- 0 && (module.exports = {
168
+ export {
91
169
  VERSION,
92
170
  cerebras,
93
171
  createCerebras
94
- });
172
+ };
95
173
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/cerebras-provider.ts","../src/version.ts"],"sourcesContent":["export { createCerebras, cerebras } from './cerebras-provider';\nexport type {\n CerebrasProvider,\n CerebrasProviderSettings,\n} from './cerebras-provider';\nexport type { CerebrasErrorData } from './cerebras-provider';\nexport { VERSION } from './version';\n","import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport {\n LanguageModelV4,\n NoSuchModelError,\n ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n} from '@ai-sdk/provider-utils';\nimport { CerebrasChatModelId } from './cerebras-chat-options';\nimport { z } from 'zod/v4';\nimport { ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport { VERSION } from './version';\n\n// Add error schema and structure\nconst cerebrasErrorSchema = z.object({\n message: z.string(),\n type: z.string(),\n param: z.string(),\n code: z.string(),\n});\n\nexport type CerebrasErrorData = z.infer<typeof cerebrasErrorSchema>;\n\nconst cerebrasErrorStructure: ProviderErrorStructure<CerebrasErrorData> = {\n errorSchema: cerebrasErrorSchema,\n errorToMessage: data => data.message,\n};\n\nexport interface CerebrasProviderSettings {\n /**\n * Cerebras API key.\n */\n apiKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface CerebrasProvider extends ProviderV4 {\n /**\n * Creates a Cerebras model for text generation.\n */\n (modelId: CerebrasChatModelId): LanguageModelV4;\n\n /**\n * Creates a Cerebras model for text generation.\n */\n languageModel(modelId: CerebrasChatModelId): LanguageModelV4;\n\n /**\n * Creates a Cerebras chat model for text generation.\n */\n chat(modelId: CerebrasChatModelId): LanguageModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport function createCerebras(\n options: CerebrasProviderSettings = {},\n): CerebrasProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.cerebras.ai/v1',\n );\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'CEREBRAS_API_KEY',\n description: 'Cerebras API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk/cerebras/${VERSION}`,\n );\n\n const createLanguageModel = (modelId: CerebrasChatModelId) => {\n return new OpenAICompatibleChatLanguageModel(modelId, {\n provider: `cerebras.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n errorStructure: cerebrasErrorStructure,\n supportsStructuredOutputs: true,\n });\n };\n\n const provider = (modelId: CerebrasChatModelId) =>\n 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 cerebras = createCerebras();\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"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,+BAAkD;AAClD,sBAIO;AACP,4BAKO;AAEP,gBAAkB;;;ACXX,IAAM,UACX,OACI,iBACA;;;ADaN,IAAM,sBAAsB,YAAE,OAAO;AAAA,EACnC,SAAS,YAAE,OAAO;AAAA,EAClB,MAAM,YAAE,OAAO;AAAA,EACf,OAAO,YAAE,OAAO;AAAA,EAChB,MAAM,YAAE,OAAO;AACjB,CAAC;AAID,IAAM,yBAAoE;AAAA,EACxE,aAAa;AAAA,EACb,gBAAgB,UAAQ,KAAK;AAC/B;AA4CO,SAAS,eACd,UAAoC,CAAC,GACnB;AA5EpB;AA6EE,QAAM,cAAU;AAAA,KACd,aAAQ,YAAR,YAAmB;AAAA,EACrB;AACA,QAAM,aAAa,UACjB;AAAA,IACE;AAAA,MACE,eAAe,cAAU,kCAAW;AAAA,QAClC,QAAQ,QAAQ;AAAA,QAChB,yBAAyB;AAAA,QACzB,aAAa;AAAA,MACf,CAAC,CAAC;AAAA,MACF,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,mBAAmB,OAAO;AAAA,EAC5B;AAEF,QAAM,sBAAsB,CAAC,YAAiC;AAC5D,WAAO,IAAI,2DAAkC,SAAS;AAAA,MACpD,UAAU;AAAA,MACV,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,GAAG,IAAI;AAAA,MACpC,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,gBAAgB;AAAA,MAChB,2BAA2B;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,CAAC,YAChB,oBAAoB,OAAO;AAE7B,WAAS,uBAAuB;AAChC,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAEhB,WAAS,iBAAiB,CAAC,YAAoB;AAC7C,UAAM,IAAI,iCAAiB,EAAE,SAAS,WAAW,iBAAiB,CAAC;AAAA,EACrE;AACA,WAAS,qBAAqB,SAAS;AACvC,WAAS,aAAa,CAAC,YAAoB;AACzC,UAAM,IAAI,iCAAiB,EAAE,SAAS,WAAW,aAAa,CAAC;AAAA,EACjE;AAEA,SAAO;AACT;AAEO,IAAM,WAAW,eAAe;","names":[]}
1
+ {"version":3,"sources":["../src/cerebras-provider.ts","../src/cerebras-chat-language-model.ts","../src/version.ts"],"sourcesContent":["import type { ProviderErrorStructure } from '@ai-sdk/openai-compatible';\nimport {\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 { CerebrasChatLanguageModel } from './cerebras-chat-language-model';\nimport type { CerebrasChatModelId } from './cerebras-chat-options';\nimport { z } from 'zod/v4';\nimport { VERSION } from './version';\n\n// Add error schema and structure\nconst cerebrasErrorSchema = z.object({\n message: z.string(),\n type: z.string(),\n param: z.string(),\n code: z.string(),\n});\n\nexport type CerebrasErrorData = z.infer<typeof cerebrasErrorSchema>;\n\nconst cerebrasErrorStructure: ProviderErrorStructure<CerebrasErrorData> = {\n errorSchema: cerebrasErrorSchema,\n errorToMessage: data => data.message,\n};\n\n/**\n * Cerebras expects assistant reasoning history in the `reasoning` field, while\n * the shared OpenAI-compatible converter serializes it as `reasoning_content`.\n */\nfunction transformCerebrasRequestBody(\n args: Record<string, any>,\n): Record<string, any> {\n return {\n ...args,\n messages: Array.isArray(args.messages)\n ? args.messages.map(message => {\n if (\n message == null ||\n typeof message !== 'object' ||\n message.role !== 'assistant' ||\n !('reasoning_content' in message)\n ) {\n return message;\n }\n\n const { reasoning_content, ...rest } = message;\n\n return {\n ...rest,\n ...(!('reasoning' in rest) && reasoning_content !== undefined\n ? { reasoning: reasoning_content }\n : {}),\n };\n })\n : args.messages,\n };\n}\n\nexport interface CerebrasProviderSettings {\n /**\n * Cerebras API key.\n */\n apiKey?: string;\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface CerebrasProvider extends ProviderV4 {\n /**\n * Creates a Cerebras model for text generation.\n */\n (modelId: CerebrasChatModelId): LanguageModelV4;\n\n /**\n * Creates a Cerebras model for text generation.\n */\n languageModel(modelId: CerebrasChatModelId): LanguageModelV4;\n\n /**\n * Creates a Cerebras chat model for text generation.\n */\n chat(modelId: CerebrasChatModelId): LanguageModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport function createCerebras(\n options: CerebrasProviderSettings = {},\n): CerebrasProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.cerebras.ai/v1',\n );\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'CEREBRAS_API_KEY',\n description: 'Cerebras API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk/cerebras/${VERSION}`,\n );\n\n const createLanguageModel = (modelId: CerebrasChatModelId) => {\n return new CerebrasChatLanguageModel(modelId, {\n provider: `cerebras.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n errorStructure: cerebrasErrorStructure,\n supportsStructuredOutputs: true,\n transformRequestBody: transformCerebrasRequestBody,\n });\n };\n\n const provider = (modelId: CerebrasChatModelId) =>\n 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 cerebras = createCerebras();\n","import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport type {\n LanguageModelV4,\n LanguageModelV4CallOptions,\n LanguageModelV4GenerateResult,\n LanguageModelV4StreamPart,\n LanguageModelV4StreamResult,\n} from '@ai-sdk/provider';\nimport {\n serializeModelOptions,\n WORKFLOW_DESERIALIZE,\n WORKFLOW_SERIALIZE,\n} from '@ai-sdk/provider-utils';\nimport type { CerebrasChatModelId } from './cerebras-chat-language-model-options';\n\ntype CerebrasChatConfig = ConstructorParameters<\n typeof OpenAICompatibleChatLanguageModel\n>[1];\n\nfunction isStructuredOutputWithToolCallsFinishReason({\n rawFinishReason,\n hasText,\n responseFormatType,\n}: {\n rawFinishReason: string | undefined;\n hasText: boolean;\n responseFormatType:\n | NonNullable<LanguageModelV4CallOptions['responseFormat']>['type']\n | undefined;\n}) {\n return (\n responseFormatType === 'json' && rawFinishReason === 'tool_calls' && hasText\n );\n}\n\nexport class CerebrasChatLanguageModel\n extends OpenAICompatibleChatLanguageModel\n implements LanguageModelV4\n{\n static [WORKFLOW_SERIALIZE](model: CerebrasChatLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: CerebrasChatModelId;\n config: CerebrasChatConfig;\n }) {\n return new CerebrasChatLanguageModel(options.modelId, options.config);\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const result = await super.doGenerate(options);\n\n if (\n !isStructuredOutputWithToolCallsFinishReason({\n rawFinishReason: result.finishReason.raw,\n hasText: result.content.some(\n part => part.type === 'text' && part.text.length > 0,\n ),\n responseFormatType: options.responseFormat?.type,\n })\n ) {\n return result;\n }\n\n return {\n ...result,\n // Cerebras GLM can return valid structured output text while also\n // repeating a tool call. Treat that mixed response as the final answer.\n content: result.content.filter(part => part.type !== 'tool-call'),\n finishReason: {\n ...result.finishReason,\n unified: 'stop',\n },\n };\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const result = await super.doStream(options);\n let hasText = false;\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 === 'text-delta' && part.delta.length > 0) {\n hasText = true;\n }\n\n if (\n part.type === 'finish' &&\n isStructuredOutputWithToolCallsFinishReason({\n rawFinishReason: part.finishReason.raw,\n hasText,\n responseFormatType: options.responseFormat?.type,\n })\n ) {\n controller.enqueue({\n ...part,\n finishReason: {\n ...part.finishReason,\n unified: 'stop',\n },\n });\n return;\n }\n\n if (\n options.responseFormat?.type === 'json' &&\n hasText &&\n (part.type === 'tool-input-start' ||\n part.type === 'tool-input-delta' ||\n part.type === 'tool-input-end' ||\n part.type === 'tool-call')\n ) {\n return;\n }\n\n controller.enqueue(part);\n },\n }),\n ),\n };\n }\n}\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"],"mappings":"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","names":[]}
@@ -117,7 +117,7 @@ const result = streamText({
117
117
  prompt: 'How many "r"s are in the word "strawberry"?',
118
118
  });
119
119
 
120
- for await (const part of result.fullStream) {
120
+ for await (const part of result.stream) {
121
121
  if (part.type === 'reasoning') {
122
122
  console.log('Reasoning:', part.text);
123
123
  } else if (part.type === 'text-delta') {
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@ai-sdk/cerebras",
3
- "version": "3.0.0-beta.4",
3
+ "version": "3.0.0-beta.57",
4
+ "type": "module",
4
5
  "license": "Apache-2.0",
5
6
  "sideEffects": false,
6
7
  "main": "./dist/index.js",
7
- "module": "./dist/index.mjs",
8
8
  "types": "./dist/index.d.ts",
9
9
  "files": [
10
10
  "dist/**/*",
@@ -24,18 +24,18 @@
24
24
  "./package.json": "./package.json",
25
25
  ".": {
26
26
  "types": "./dist/index.d.ts",
27
- "import": "./dist/index.mjs",
28
- "require": "./dist/index.js"
27
+ "import": "./dist/index.js",
28
+ "default": "./dist/index.js"
29
29
  }
30
30
  },
31
31
  "dependencies": {
32
- "@ai-sdk/openai-compatible": "3.0.0-beta.4",
33
- "@ai-sdk/provider": "4.0.0-beta.1",
34
- "@ai-sdk/provider-utils": "5.0.0-beta.2"
32
+ "@ai-sdk/openai-compatible": "3.0.0-beta.57",
33
+ "@ai-sdk/provider": "4.0.0-beta.19",
34
+ "@ai-sdk/provider-utils": "5.0.0-beta.49"
35
35
  },
36
36
  "devDependencies": {
37
- "@types/node": "20.17.24",
38
- "tsup": "^8",
37
+ "@types/node": "22.19.19",
38
+ "tsup": "^8.5.1",
39
39
  "typescript": "5.8.3",
40
40
  "zod": "3.25.76",
41
41
  "@vercel/ai-tsconfig": "0.0.0"
@@ -44,15 +44,17 @@
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
- "access": "public"
50
+ "access": "public",
51
+ "provenance": true
51
52
  },
52
53
  "homepage": "https://ai-sdk.dev/docs",
53
54
  "repository": {
54
55
  "type": "git",
55
- "url": "git+https://github.com/vercel/ai.git"
56
+ "url": "https://github.com/vercel/ai",
57
+ "directory": "packages/cerebras"
56
58
  },
57
59
  "bugs": {
58
60
  "url": "https://github.com/vercel/ai/issues"
@@ -61,15 +63,11 @@
61
63
  "ai"
62
64
  ],
63
65
  "description": "The **Cerebras provider** for the [AI SDK](https://ai-sdk.dev/docs) contains language model support for [Cerebras](https://cerebras.ai), offering high-speed AI model inference powered by Cerebras Wafer-Scale Engines and CS-3 systems.",
64
- "author": "",
65
- "type": "commonjs",
66
66
  "scripts": {
67
67
  "build": "pnpm clean && tsup --tsconfig tsconfig.build.json",
68
68
  "build:watch": "pnpm clean && tsup --watch",
69
69
  "clean": "del-cli dist docs *.tsbuildinfo",
70
- "lint": "eslint \"./**/*.ts*\"",
71
70
  "type-check": "tsc --build",
72
- "prettier-check": "prettier --check \"./**/*.ts*\"",
73
71
  "test": "pnpm test:node && pnpm test:edge",
74
72
  "test:update": "pnpm test:node -u",
75
73
  "test:watch": "vitest --config vitest.node.config.js",
@@ -0,0 +1,3 @@
1
+ export type { CerebrasChatModelId } from './cerebras-chat-options';
2
+
3
+ export type CerebrasLanguageModelChatOptions = Record<string, never>;
@@ -0,0 +1,136 @@
1
+ import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';
2
+ import type {
3
+ LanguageModelV4,
4
+ LanguageModelV4CallOptions,
5
+ LanguageModelV4GenerateResult,
6
+ LanguageModelV4StreamPart,
7
+ LanguageModelV4StreamResult,
8
+ } from '@ai-sdk/provider';
9
+ import {
10
+ serializeModelOptions,
11
+ WORKFLOW_DESERIALIZE,
12
+ WORKFLOW_SERIALIZE,
13
+ } from '@ai-sdk/provider-utils';
14
+ import type { CerebrasChatModelId } from './cerebras-chat-language-model-options';
15
+
16
+ type CerebrasChatConfig = ConstructorParameters<
17
+ typeof OpenAICompatibleChatLanguageModel
18
+ >[1];
19
+
20
+ function isStructuredOutputWithToolCallsFinishReason({
21
+ rawFinishReason,
22
+ hasText,
23
+ responseFormatType,
24
+ }: {
25
+ rawFinishReason: string | undefined;
26
+ hasText: boolean;
27
+ responseFormatType:
28
+ | NonNullable<LanguageModelV4CallOptions['responseFormat']>['type']
29
+ | undefined;
30
+ }) {
31
+ return (
32
+ responseFormatType === 'json' && rawFinishReason === 'tool_calls' && hasText
33
+ );
34
+ }
35
+
36
+ export class CerebrasChatLanguageModel
37
+ extends OpenAICompatibleChatLanguageModel
38
+ implements LanguageModelV4
39
+ {
40
+ static [WORKFLOW_SERIALIZE](model: CerebrasChatLanguageModel) {
41
+ return serializeModelOptions({
42
+ modelId: model.modelId,
43
+ config: model.config,
44
+ });
45
+ }
46
+
47
+ static [WORKFLOW_DESERIALIZE](options: {
48
+ modelId: CerebrasChatModelId;
49
+ config: CerebrasChatConfig;
50
+ }) {
51
+ return new CerebrasChatLanguageModel(options.modelId, options.config);
52
+ }
53
+
54
+ async doGenerate(
55
+ options: LanguageModelV4CallOptions,
56
+ ): Promise<LanguageModelV4GenerateResult> {
57
+ const result = await super.doGenerate(options);
58
+
59
+ if (
60
+ !isStructuredOutputWithToolCallsFinishReason({
61
+ rawFinishReason: result.finishReason.raw,
62
+ hasText: result.content.some(
63
+ part => part.type === 'text' && part.text.length > 0,
64
+ ),
65
+ responseFormatType: options.responseFormat?.type,
66
+ })
67
+ ) {
68
+ return result;
69
+ }
70
+
71
+ return {
72
+ ...result,
73
+ // Cerebras GLM can return valid structured output text while also
74
+ // repeating a tool call. Treat that mixed response as the final answer.
75
+ content: result.content.filter(part => part.type !== 'tool-call'),
76
+ finishReason: {
77
+ ...result.finishReason,
78
+ unified: 'stop',
79
+ },
80
+ };
81
+ }
82
+
83
+ async doStream(
84
+ options: LanguageModelV4CallOptions,
85
+ ): Promise<LanguageModelV4StreamResult> {
86
+ const result = await super.doStream(options);
87
+ let hasText = false;
88
+
89
+ return {
90
+ ...result,
91
+ stream: result.stream.pipeThrough(
92
+ new TransformStream<
93
+ LanguageModelV4StreamPart,
94
+ LanguageModelV4StreamPart
95
+ >({
96
+ transform(part, controller) {
97
+ if (part.type === 'text-delta' && part.delta.length > 0) {
98
+ hasText = true;
99
+ }
100
+
101
+ if (
102
+ part.type === 'finish' &&
103
+ isStructuredOutputWithToolCallsFinishReason({
104
+ rawFinishReason: part.finishReason.raw,
105
+ hasText,
106
+ responseFormatType: options.responseFormat?.type,
107
+ })
108
+ ) {
109
+ controller.enqueue({
110
+ ...part,
111
+ finishReason: {
112
+ ...part.finishReason,
113
+ unified: 'stop',
114
+ },
115
+ });
116
+ return;
117
+ }
118
+
119
+ if (
120
+ options.responseFormat?.type === 'json' &&
121
+ hasText &&
122
+ (part.type === 'tool-input-start' ||
123
+ part.type === 'tool-input-delta' ||
124
+ part.type === 'tool-input-end' ||
125
+ part.type === 'tool-call')
126
+ ) {
127
+ return;
128
+ }
129
+
130
+ controller.enqueue(part);
131
+ },
132
+ }),
133
+ ),
134
+ };
135
+ }
136
+ }
@@ -1,18 +1,18 @@
1
- import { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';
1
+ import type { ProviderErrorStructure } from '@ai-sdk/openai-compatible';
2
2
  import {
3
- LanguageModelV4,
4
3
  NoSuchModelError,
5
- ProviderV4,
4
+ type LanguageModelV4,
5
+ type ProviderV4,
6
6
  } from '@ai-sdk/provider';
7
7
  import {
8
- FetchFunction,
9
8
  loadApiKey,
10
9
  withoutTrailingSlash,
11
10
  withUserAgentSuffix,
11
+ type FetchFunction,
12
12
  } from '@ai-sdk/provider-utils';
13
- import { CerebrasChatModelId } from './cerebras-chat-options';
13
+ import { CerebrasChatLanguageModel } from './cerebras-chat-language-model';
14
+ import type { CerebrasChatModelId } from './cerebras-chat-options';
14
15
  import { z } from 'zod/v4';
15
- import { ProviderErrorStructure } from '@ai-sdk/openai-compatible';
16
16
  import { VERSION } from './version';
17
17
 
18
18
  // Add error schema and structure
@@ -30,6 +30,39 @@ const cerebrasErrorStructure: ProviderErrorStructure<CerebrasErrorData> = {
30
30
  errorToMessage: data => data.message,
31
31
  };
32
32
 
33
+ /**
34
+ * Cerebras expects assistant reasoning history in the `reasoning` field, while
35
+ * the shared OpenAI-compatible converter serializes it as `reasoning_content`.
36
+ */
37
+ function transformCerebrasRequestBody(
38
+ args: Record<string, any>,
39
+ ): Record<string, any> {
40
+ return {
41
+ ...args,
42
+ messages: Array.isArray(args.messages)
43
+ ? args.messages.map(message => {
44
+ if (
45
+ message == null ||
46
+ typeof message !== 'object' ||
47
+ message.role !== 'assistant' ||
48
+ !('reasoning_content' in message)
49
+ ) {
50
+ return message;
51
+ }
52
+
53
+ const { reasoning_content, ...rest } = message;
54
+
55
+ return {
56
+ ...rest,
57
+ ...(!('reasoning' in rest) && reasoning_content !== undefined
58
+ ? { reasoning: reasoning_content }
59
+ : {}),
60
+ };
61
+ })
62
+ : args.messages,
63
+ };
64
+ }
65
+
33
66
  export interface CerebrasProviderSettings {
34
67
  /**
35
68
  * Cerebras API key.
@@ -92,13 +125,14 @@ export function createCerebras(
92
125
  );
93
126
 
94
127
  const createLanguageModel = (modelId: CerebrasChatModelId) => {
95
- return new OpenAICompatibleChatLanguageModel(modelId, {
128
+ return new CerebrasChatLanguageModel(modelId, {
96
129
  provider: `cerebras.chat`,
97
130
  url: ({ path }) => `${baseURL}${path}`,
98
131
  headers: getHeaders,
99
132
  fetch: options.fetch,
100
133
  errorStructure: cerebrasErrorStructure,
101
134
  supportsStructuredOutputs: true,
135
+ transformRequestBody: transformCerebrasRequestBody,
102
136
  });
103
137
  };
104
138
 
@@ -0,0 +1,47 @@
1
+ {
2
+ "id": "chatcmpl-d89ba80c-26b3-442c-ac3c-d7e94a99c484",
3
+ "choices": [
4
+ {
5
+ "finish_reason": "tool_calls",
6
+ "index": 0,
7
+ "message": {
8
+ "reasoning": "The user is asking about a \"magic number\". I see that I have access to a function called \"nonUsefulTool\" which \"returns a magic number\". This seems like exactly what the user is asking for. Let me call this function to get the magic number for them.",
9
+ "tool_calls": [
10
+ {
11
+ "function": {
12
+ "name": "nonUsefulTool",
13
+ "arguments": "{}"
14
+ },
15
+ "type": "function",
16
+ "id": "85e4fd267"
17
+ }
18
+ ],
19
+ "role": "assistant"
20
+ }
21
+ }
22
+ ],
23
+ "created": 1779146781,
24
+ "model": "zai-glm-4.7",
25
+ "system_fingerprint": "fp_a33c042689e969567008",
26
+ "object": "chat.completion",
27
+ "usage": {
28
+ "total_tokens": 387,
29
+ "completion_tokens": 65,
30
+ "completion_tokens_details": {
31
+ "accepted_prediction_tokens": 0,
32
+ "rejected_prediction_tokens": 0,
33
+ "reasoning_tokens": 58
34
+ },
35
+ "prompt_tokens": 322,
36
+ "prompt_tokens_details": {
37
+ "cached_tokens": 256
38
+ }
39
+ },
40
+ "time_info": {
41
+ "created": 1779146781.786984,
42
+ "queue_time": 0.002922005,
43
+ "prompt_time": 0.010518105,
44
+ "completion_time": 0.118095092,
45
+ "total_time": 0.13299274444580078
46
+ }
47
+ }
@@ -0,0 +1,48 @@
1
+ {
2
+ "id": "chatcmpl-a6f2645e-5553-4ede-acde-612e0035b1cc",
3
+ "choices": [
4
+ {
5
+ "finish_reason": "tool_calls",
6
+ "index": 0,
7
+ "message": {
8
+ "content": "{\"result\":\"2026\"}",
9
+ "reasoning": "The function returned 2026 as the magic number. Now I need to return this as a JSON object matching the specified schema. The schema requires a \"result\" property of type string. So I should wrap the magic number in a string.",
10
+ "tool_calls": [
11
+ {
12
+ "function": {
13
+ "name": "nonUsefulTool",
14
+ "arguments": "{}"
15
+ },
16
+ "type": "function",
17
+ "id": "0babb4517"
18
+ }
19
+ ],
20
+ "role": "assistant"
21
+ }
22
+ }
23
+ ],
24
+ "created": 1779146782,
25
+ "model": "zai-glm-4.7",
26
+ "system_fingerprint": "fp_a33c042689e969567008",
27
+ "object": "chat.completion",
28
+ "usage": {
29
+ "total_tokens": 457,
30
+ "completion_tokens": 63,
31
+ "completion_tokens_details": {
32
+ "accepted_prediction_tokens": 0,
33
+ "rejected_prediction_tokens": 0,
34
+ "reasoning_tokens": 50
35
+ },
36
+ "prompt_tokens": 394,
37
+ "prompt_tokens_details": {
38
+ "cached_tokens": 256
39
+ }
40
+ },
41
+ "time_info": {
42
+ "created": 1779146782.19271,
43
+ "queue_time": 0.002844976,
44
+ "prompt_time": 0.012194163,
45
+ "completion_time": 0.115990643,
46
+ "total_time": 0.13260841369628906
47
+ }
48
+ }