@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/CHANGELOG.md +474 -4
- package/README.md +2 -0
- package/dist/index.js +123 -45
- package/dist/index.js.map +1 -1
- package/docs/40-cerebras.mdx +1 -1
- package/package.json +14 -16
- package/src/cerebras-chat-language-model-options.ts +3 -0
- package/src/cerebras-chat-language-model.ts +136 -0
- package/src/cerebras-provider.ts +41 -7
- package/src/fixtures/cerebras-structured-output-tools.1.json +47 -0
- package/src/fixtures/cerebras-structured-output-tools.2.json +48 -0
- package/src/fixtures/cererebras-structured-output-tools.1.chunks.txt +97 -0
- package/dist/index.d.mts +0 -56
- package/dist/index.mjs +0 -72
- package/dist/index.mjs.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,59 +1,137 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
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.
|
|
99
|
+
var VERSION = true ? "3.0.0-beta.57" : "0.0.0-test";
|
|
37
100
|
|
|
38
101
|
// src/cerebras-provider.ts
|
|
39
|
-
var cerebrasErrorSchema =
|
|
40
|
-
message:
|
|
41
|
-
type:
|
|
42
|
-
param:
|
|
43
|
-
code:
|
|
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 =
|
|
129
|
+
const baseURL = withoutTrailingSlash(
|
|
52
130
|
(_a = options.baseURL) != null ? _a : "https://api.cerebras.ai/v1"
|
|
53
131
|
);
|
|
54
|
-
const getHeaders = () =>
|
|
132
|
+
const getHeaders = () => withUserAgentSuffix(
|
|
55
133
|
{
|
|
56
|
-
Authorization: `Bearer ${
|
|
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
|
|
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
|
|
159
|
+
throw new NoSuchModelError({ modelId, modelType: "embeddingModel" });
|
|
81
160
|
};
|
|
82
161
|
provider.textEmbeddingModel = provider.embeddingModel;
|
|
83
162
|
provider.imageModel = (modelId) => {
|
|
84
|
-
throw new
|
|
163
|
+
throw new NoSuchModelError({ modelId, modelType: "imageModel" });
|
|
85
164
|
};
|
|
86
165
|
return provider;
|
|
87
166
|
}
|
|
88
167
|
var cerebras = createCerebras();
|
|
89
|
-
|
|
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":[]}
|
package/docs/40-cerebras.mdx
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
28
|
-
"
|
|
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.
|
|
33
|
-
"@ai-sdk/provider": "4.0.0-beta.
|
|
34
|
-
"@ai-sdk/provider-utils": "5.0.0-beta.
|
|
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": "
|
|
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": ">=
|
|
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": "
|
|
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,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
|
+
}
|
package/src/cerebras-provider.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ProviderErrorStructure } from '@ai-sdk/openai-compatible';
|
|
2
2
|
import {
|
|
3
|
-
LanguageModelV4,
|
|
4
3
|
NoSuchModelError,
|
|
5
|
-
|
|
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 {
|
|
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
|
|
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
|
+
}
|