@standardagents/cerebras 0.0.1-dev.fffff
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.d.ts +62 -0
- package/dist/index.js +889 -0
- package/dist/index.js.map +1 -0
- package/package.json +50 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { LLMProviderInterface, ProviderFactoryConfig, ModelCapabilities, ProviderModelInfo, ProviderRequest, ProviderResponse, ProviderStreamChunk, InspectedRequest, ProviderFactoryWithOptions } from '@standardagents/spec';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Cerebras provider options schema.
|
|
6
|
+
*
|
|
7
|
+
* The provider uses Cerebras' Chat Completions API directly. The schema
|
|
8
|
+
* covers the common documented parameters and remains passthrough for
|
|
9
|
+
* forward compatibility with new API fields.
|
|
10
|
+
*/
|
|
11
|
+
declare const cerebrasProviderOptions: z.ZodObject<{
|
|
12
|
+
clear_thinking: z.ZodOptional<z.ZodBoolean>;
|
|
13
|
+
logprobs: z.ZodOptional<z.ZodBoolean>;
|
|
14
|
+
top_logprobs: z.ZodOptional<z.ZodNumber>;
|
|
15
|
+
seed: z.ZodOptional<z.ZodNumber>;
|
|
16
|
+
user: z.ZodOptional<z.ZodString>;
|
|
17
|
+
service_tier: z.ZodOptional<z.ZodEnum<{
|
|
18
|
+
priority: "priority";
|
|
19
|
+
default: "default";
|
|
20
|
+
auto: "auto";
|
|
21
|
+
flex: "flex";
|
|
22
|
+
}>>;
|
|
23
|
+
reasoning_effort: z.ZodOptional<z.ZodEnum<{
|
|
24
|
+
none: "none";
|
|
25
|
+
low: "low";
|
|
26
|
+
medium: "medium";
|
|
27
|
+
high: "high";
|
|
28
|
+
}>>;
|
|
29
|
+
}, z.core.$loose>;
|
|
30
|
+
type CerebrasProviderOptions = z.infer<typeof cerebrasProviderOptions>;
|
|
31
|
+
|
|
32
|
+
declare class CerebrasProvider implements LLMProviderInterface {
|
|
33
|
+
readonly name = "cerebras";
|
|
34
|
+
readonly specificationVersion: "1";
|
|
35
|
+
private config;
|
|
36
|
+
private static modelsCache;
|
|
37
|
+
private static modelsCacheTime;
|
|
38
|
+
private static readonly CACHE_TTL;
|
|
39
|
+
constructor(config: ProviderFactoryConfig);
|
|
40
|
+
supportsModel(_modelId: string): boolean;
|
|
41
|
+
getIcon(modelId?: string): string;
|
|
42
|
+
private fetchModelsWithCache;
|
|
43
|
+
private mapModelCapabilities;
|
|
44
|
+
getModelCapabilities(modelId: string): Promise<ModelCapabilities | null>;
|
|
45
|
+
private mapToProviderModelInfo;
|
|
46
|
+
getModels(filter?: string): Promise<ProviderModelInfo[]>;
|
|
47
|
+
generate(request: ProviderRequest): Promise<ProviderResponse>;
|
|
48
|
+
stream(request: ProviderRequest): Promise<AsyncIterable<ProviderStreamChunk>>;
|
|
49
|
+
private toProviderError;
|
|
50
|
+
private toHttpProviderError;
|
|
51
|
+
inspectRequest(request: ProviderRequest): Promise<InspectedRequest>;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Cerebras provider factory for Standard Agents.
|
|
56
|
+
*
|
|
57
|
+
* Uses Cerebras' OpenAI-compatible Chat Completions API with typed
|
|
58
|
+
* providerOptions for Cerebras-specific request parameters.
|
|
59
|
+
*/
|
|
60
|
+
declare const cerebras: ProviderFactoryWithOptions<typeof cerebrasProviderOptions>;
|
|
61
|
+
|
|
62
|
+
export { CerebrasProvider, type CerebrasProviderOptions, cerebras, cerebrasProviderOptions };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,889 @@
|
|
|
1
|
+
// src/CerebrasProvider.ts
|
|
2
|
+
import { ProviderError } from "@standardagents/spec";
|
|
3
|
+
|
|
4
|
+
// src/chat-completions-transformers.ts
|
|
5
|
+
function transformChatContentPart(part) {
|
|
6
|
+
if (part.type === "text") {
|
|
7
|
+
return { type: "text", text: part.text };
|
|
8
|
+
}
|
|
9
|
+
if (part.type === "image") {
|
|
10
|
+
const data = part.data || "";
|
|
11
|
+
const imageUrl = data.startsWith("data:") ? data : `data:${part.mediaType || "image/png"};base64,${data}`;
|
|
12
|
+
return {
|
|
13
|
+
type: "image_url",
|
|
14
|
+
image_url: {
|
|
15
|
+
url: imageUrl,
|
|
16
|
+
detail: part.detail || "auto"
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (part.type === "image_url") {
|
|
21
|
+
return {
|
|
22
|
+
type: "image_url",
|
|
23
|
+
image_url: {
|
|
24
|
+
url: part.image_url?.url || "",
|
|
25
|
+
detail: part.image_url?.detail || "auto"
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
type: "text",
|
|
31
|
+
text: `[File: ${part.filename || "file"}]`
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function transformChatMessageContent(content) {
|
|
35
|
+
if (typeof content === "string") {
|
|
36
|
+
return content;
|
|
37
|
+
}
|
|
38
|
+
return content.map(transformChatContentPart);
|
|
39
|
+
}
|
|
40
|
+
function transformChatSystemMessage(msg) {
|
|
41
|
+
return {
|
|
42
|
+
role: "system",
|
|
43
|
+
content: msg.content
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function transformChatUserMessage(msg) {
|
|
47
|
+
return {
|
|
48
|
+
role: "user",
|
|
49
|
+
content: transformChatMessageContent(msg.content)
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function transformChatAssistantMessage(msg) {
|
|
53
|
+
const message = {
|
|
54
|
+
role: "assistant",
|
|
55
|
+
content: msg.content || null
|
|
56
|
+
};
|
|
57
|
+
if (msg.toolCalls && msg.toolCalls.length > 0) {
|
|
58
|
+
message.tool_calls = msg.toolCalls.map((tc) => ({
|
|
59
|
+
id: tc.id,
|
|
60
|
+
type: "function",
|
|
61
|
+
function: {
|
|
62
|
+
name: tc.name,
|
|
63
|
+
arguments: typeof tc.arguments === "string" ? tc.arguments : JSON.stringify(tc.arguments)
|
|
64
|
+
}
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
if (msg.reasoning) {
|
|
68
|
+
message.reasoning = msg.reasoning;
|
|
69
|
+
}
|
|
70
|
+
return message;
|
|
71
|
+
}
|
|
72
|
+
function transformChatToolMessage(msg) {
|
|
73
|
+
let output;
|
|
74
|
+
if (typeof msg.content === "string") {
|
|
75
|
+
output = msg.content;
|
|
76
|
+
} else if ("type" in msg.content) {
|
|
77
|
+
if (msg.content.type === "text") {
|
|
78
|
+
output = msg.content.text;
|
|
79
|
+
} else if (msg.content.type === "error") {
|
|
80
|
+
output = `Error: ${msg.content.error}`;
|
|
81
|
+
} else {
|
|
82
|
+
output = JSON.stringify(msg.content);
|
|
83
|
+
}
|
|
84
|
+
} else {
|
|
85
|
+
output = JSON.stringify(msg.content);
|
|
86
|
+
}
|
|
87
|
+
const imageAttachments = msg.attachments?.filter((a) => a.type === "image" && a.data) || [];
|
|
88
|
+
const toolMessage = {
|
|
89
|
+
role: "tool",
|
|
90
|
+
tool_call_id: msg.toolCallId,
|
|
91
|
+
content: output || (imageAttachments.length > 0 ? "Success" : "")
|
|
92
|
+
};
|
|
93
|
+
if (imageAttachments.length === 0) {
|
|
94
|
+
return { toolMessage };
|
|
95
|
+
}
|
|
96
|
+
const imageContent = [];
|
|
97
|
+
const toolName = msg.toolName || "the tool";
|
|
98
|
+
const isSingle = imageAttachments.length === 1;
|
|
99
|
+
const descriptor = isSingle ? "the file" : `${imageAttachments.length} files`;
|
|
100
|
+
const verb = isSingle ? "is" : "are";
|
|
101
|
+
imageContent.push({
|
|
102
|
+
type: "text",
|
|
103
|
+
text: `Here ${verb} ${descriptor} from ${toolName}:`
|
|
104
|
+
});
|
|
105
|
+
for (const attachment of imageAttachments) {
|
|
106
|
+
const attachmentData = attachment.data || "";
|
|
107
|
+
const imageData = attachmentData.startsWith("data:") ? attachmentData : `data:${attachment.mediaType || "image/png"};base64,${attachmentData}`;
|
|
108
|
+
imageContent.push({
|
|
109
|
+
type: "image_url",
|
|
110
|
+
image_url: {
|
|
111
|
+
url: imageData,
|
|
112
|
+
detail: "auto"
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
toolMessage,
|
|
118
|
+
syntheticUserMessage: {
|
|
119
|
+
role: "user",
|
|
120
|
+
content: imageContent
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function transformChatMessages(messages) {
|
|
125
|
+
const result = [];
|
|
126
|
+
for (const msg of messages) {
|
|
127
|
+
switch (msg.role) {
|
|
128
|
+
case "system":
|
|
129
|
+
result.push(transformChatSystemMessage(msg));
|
|
130
|
+
break;
|
|
131
|
+
case "user":
|
|
132
|
+
result.push(transformChatUserMessage(msg));
|
|
133
|
+
break;
|
|
134
|
+
case "assistant":
|
|
135
|
+
result.push(transformChatAssistantMessage(msg));
|
|
136
|
+
break;
|
|
137
|
+
case "tool": {
|
|
138
|
+
const { toolMessage, syntheticUserMessage } = transformChatToolMessage(msg);
|
|
139
|
+
result.push(toolMessage);
|
|
140
|
+
if (syntheticUserMessage) {
|
|
141
|
+
result.push(syntheticUserMessage);
|
|
142
|
+
}
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
function transformChatTool(tool) {
|
|
150
|
+
const inputParams = tool.function.parameters;
|
|
151
|
+
const parameters = inputParams && typeof inputParams === "object" ? {
|
|
152
|
+
...inputParams,
|
|
153
|
+
additionalProperties: false
|
|
154
|
+
} : {
|
|
155
|
+
type: "object",
|
|
156
|
+
properties: {},
|
|
157
|
+
required: [],
|
|
158
|
+
additionalProperties: false
|
|
159
|
+
};
|
|
160
|
+
return {
|
|
161
|
+
type: "function",
|
|
162
|
+
function: {
|
|
163
|
+
name: tool.function.name,
|
|
164
|
+
description: tool.function.description || void 0,
|
|
165
|
+
parameters,
|
|
166
|
+
strict: true
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function transformChatTools(tools) {
|
|
171
|
+
return tools.map(transformChatTool);
|
|
172
|
+
}
|
|
173
|
+
function transformChatToolChoice(choice) {
|
|
174
|
+
if (choice === "auto") return "auto";
|
|
175
|
+
if (choice === "none") return "none";
|
|
176
|
+
if (choice === "required") return "required";
|
|
177
|
+
if (typeof choice === "object" && "name" in choice) {
|
|
178
|
+
return { type: "function", function: { name: choice.name } };
|
|
179
|
+
}
|
|
180
|
+
return void 0;
|
|
181
|
+
}
|
|
182
|
+
function mapChatFinishReason(finishReason) {
|
|
183
|
+
switch (finishReason) {
|
|
184
|
+
case "stop":
|
|
185
|
+
return "stop";
|
|
186
|
+
case "tool_calls":
|
|
187
|
+
return "tool_calls";
|
|
188
|
+
case "length":
|
|
189
|
+
return "length";
|
|
190
|
+
case "content_filter":
|
|
191
|
+
return "content_filter";
|
|
192
|
+
case "error":
|
|
193
|
+
return "error";
|
|
194
|
+
default:
|
|
195
|
+
return "stop";
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function extractChatToolCalls(toolCalls) {
|
|
199
|
+
if (!toolCalls || toolCalls.length === 0) {
|
|
200
|
+
return void 0;
|
|
201
|
+
}
|
|
202
|
+
return toolCalls.map((tc) => {
|
|
203
|
+
let parsedArgs = {};
|
|
204
|
+
try {
|
|
205
|
+
parsedArgs = tc.function.arguments ? JSON.parse(tc.function.arguments) : {};
|
|
206
|
+
} catch {
|
|
207
|
+
parsedArgs = {};
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
id: tc.id,
|
|
211
|
+
name: tc.function.name,
|
|
212
|
+
arguments: parsedArgs
|
|
213
|
+
};
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
function transformChatUsage(usage) {
|
|
217
|
+
if (!usage) {
|
|
218
|
+
return {
|
|
219
|
+
promptTokens: 0,
|
|
220
|
+
completionTokens: 0,
|
|
221
|
+
totalTokens: 0
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
promptTokens: usage.prompt_tokens || 0,
|
|
226
|
+
completionTokens: usage.completion_tokens || 0,
|
|
227
|
+
totalTokens: usage.total_tokens || 0,
|
|
228
|
+
reasoningTokens: usage.completion_tokens_details?.reasoning_tokens,
|
|
229
|
+
cachedTokens: usage.prompt_tokens_details?.cached_tokens
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
function transformChatResponse(response) {
|
|
233
|
+
const choice = response.choices?.[0];
|
|
234
|
+
const message = choice?.message;
|
|
235
|
+
const reasoning = message?.reasoning || null;
|
|
236
|
+
return {
|
|
237
|
+
content: message?.content || null,
|
|
238
|
+
reasoning,
|
|
239
|
+
reasoningDetails: reasoning ? [{ type: "text", text: reasoning }] : void 0,
|
|
240
|
+
toolCalls: extractChatToolCalls(message?.tool_calls),
|
|
241
|
+
finishReason: mapChatFinishReason(choice?.finish_reason),
|
|
242
|
+
usage: transformChatUsage(response.usage),
|
|
243
|
+
metadata: {
|
|
244
|
+
model: response.model,
|
|
245
|
+
provider: "cerebras",
|
|
246
|
+
requestId: response.id,
|
|
247
|
+
serviceTierUsed: response.service_tier_used,
|
|
248
|
+
systemFingerprint: response.system_fingerprint,
|
|
249
|
+
timeInfo: response.time_info
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
function createChatStreamState() {
|
|
254
|
+
return {
|
|
255
|
+
content: "",
|
|
256
|
+
toolCalls: /* @__PURE__ */ new Map(),
|
|
257
|
+
reasoningContent: "",
|
|
258
|
+
hasContent: false,
|
|
259
|
+
hasReasoning: false,
|
|
260
|
+
finishReason: null
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
function processChatStreamChunk(chunk, state) {
|
|
264
|
+
const chunks = [];
|
|
265
|
+
const choice = chunk.choices?.[0];
|
|
266
|
+
const delta = choice?.delta;
|
|
267
|
+
if (!delta && !choice?.finish_reason && !chunk.usage) {
|
|
268
|
+
return chunks;
|
|
269
|
+
}
|
|
270
|
+
if (delta?.content) {
|
|
271
|
+
state.hasContent = true;
|
|
272
|
+
state.content += delta.content;
|
|
273
|
+
chunks.push({ type: "content-delta", delta: delta.content });
|
|
274
|
+
}
|
|
275
|
+
if (delta?.reasoning) {
|
|
276
|
+
state.hasReasoning = true;
|
|
277
|
+
state.reasoningContent += delta.reasoning;
|
|
278
|
+
chunks.push({ type: "reasoning-delta", delta: delta.reasoning });
|
|
279
|
+
}
|
|
280
|
+
if (delta?.tool_calls) {
|
|
281
|
+
for (const tc of delta.tool_calls) {
|
|
282
|
+
const existing = state.toolCalls.get(tc.index);
|
|
283
|
+
if (tc.id && tc.function?.name) {
|
|
284
|
+
state.toolCalls.set(tc.index, {
|
|
285
|
+
id: tc.id,
|
|
286
|
+
name: tc.function.name,
|
|
287
|
+
arguments: tc.function.arguments || ""
|
|
288
|
+
});
|
|
289
|
+
chunks.push({
|
|
290
|
+
type: "tool-call-start",
|
|
291
|
+
id: tc.id,
|
|
292
|
+
name: tc.function.name
|
|
293
|
+
});
|
|
294
|
+
} else if (existing && tc.function?.arguments) {
|
|
295
|
+
existing.arguments += tc.function.arguments;
|
|
296
|
+
chunks.push({
|
|
297
|
+
type: "tool-call-delta",
|
|
298
|
+
id: existing.id,
|
|
299
|
+
argumentsDelta: tc.function.arguments
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (choice?.finish_reason) {
|
|
305
|
+
state.finishReason = choice.finish_reason;
|
|
306
|
+
if (state.hasContent) {
|
|
307
|
+
chunks.push({ type: "content-done" });
|
|
308
|
+
}
|
|
309
|
+
if (state.hasReasoning) {
|
|
310
|
+
chunks.push({ type: "reasoning-done" });
|
|
311
|
+
}
|
|
312
|
+
for (const tc of state.toolCalls.values()) {
|
|
313
|
+
let parsedArgs = {};
|
|
314
|
+
try {
|
|
315
|
+
parsedArgs = tc.arguments ? JSON.parse(tc.arguments) : {};
|
|
316
|
+
} catch {
|
|
317
|
+
parsedArgs = {};
|
|
318
|
+
}
|
|
319
|
+
chunks.push({
|
|
320
|
+
type: "tool-call-done",
|
|
321
|
+
id: tc.id,
|
|
322
|
+
arguments: parsedArgs
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
if (chunk.usage) {
|
|
327
|
+
const reasoningDetails = state.reasoningContent ? [{ type: "text", text: state.reasoningContent }] : void 0;
|
|
328
|
+
chunks.push({
|
|
329
|
+
type: "finish",
|
|
330
|
+
finishReason: mapChatFinishReason(state.finishReason),
|
|
331
|
+
usage: transformChatUsage(chunk.usage),
|
|
332
|
+
reasoningDetails
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
return chunks;
|
|
336
|
+
}
|
|
337
|
+
function parseChatStreamEvent(jsonStr) {
|
|
338
|
+
try {
|
|
339
|
+
return JSON.parse(jsonStr);
|
|
340
|
+
} catch {
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
async function* parseChatSSEStream(response, state) {
|
|
345
|
+
const reader = response.body?.getReader();
|
|
346
|
+
if (!reader) {
|
|
347
|
+
throw new Error("No response body");
|
|
348
|
+
}
|
|
349
|
+
const decoder = new TextDecoder();
|
|
350
|
+
let buffer = "";
|
|
351
|
+
try {
|
|
352
|
+
while (true) {
|
|
353
|
+
const { done, value } = await reader.read();
|
|
354
|
+
if (done) break;
|
|
355
|
+
buffer += decoder.decode(value, { stream: true });
|
|
356
|
+
const lines = buffer.split("\n");
|
|
357
|
+
buffer = lines.pop() || "";
|
|
358
|
+
for (const line of lines) {
|
|
359
|
+
const trimmed = line.trim();
|
|
360
|
+
if (!trimmed || trimmed.startsWith(":")) continue;
|
|
361
|
+
if (!trimmed.startsWith("data: ")) continue;
|
|
362
|
+
const data = trimmed.slice(6);
|
|
363
|
+
if (data === "[DONE]") continue;
|
|
364
|
+
const chunk = parseChatStreamEvent(data);
|
|
365
|
+
if (!chunk) continue;
|
|
366
|
+
for (const providerChunk of processChatStreamChunk(chunk, state)) {
|
|
367
|
+
yield providerChunk;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (buffer.trim()) {
|
|
372
|
+
const trimmed = buffer.trim();
|
|
373
|
+
if (trimmed.startsWith("data: ")) {
|
|
374
|
+
const data = trimmed.slice(6);
|
|
375
|
+
if (data !== "[DONE]") {
|
|
376
|
+
const chunk = parseChatStreamEvent(data);
|
|
377
|
+
if (chunk) {
|
|
378
|
+
for (const providerChunk of processChatStreamChunk(chunk, state)) {
|
|
379
|
+
yield providerChunk;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
} finally {
|
|
386
|
+
reader.releaseLock();
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
function mapCerebrasReasoningEffort(model, level) {
|
|
390
|
+
if (model.startsWith("gpt-oss-")) {
|
|
391
|
+
if (level >= 100) return "high";
|
|
392
|
+
if (level >= 66) return "medium";
|
|
393
|
+
if (level >= 33) return "low";
|
|
394
|
+
if (level > 0) return "low";
|
|
395
|
+
return void 0;
|
|
396
|
+
}
|
|
397
|
+
if (model.startsWith("zai-glm-4.7")) {
|
|
398
|
+
return level === 0 ? "none" : void 0;
|
|
399
|
+
}
|
|
400
|
+
return void 0;
|
|
401
|
+
}
|
|
402
|
+
function buildChatParams(request) {
|
|
403
|
+
const params = {
|
|
404
|
+
model: request.model,
|
|
405
|
+
messages: transformChatMessages(request.messages)
|
|
406
|
+
};
|
|
407
|
+
if (request.tools && request.tools.length > 0) {
|
|
408
|
+
params.tools = transformChatTools(request.tools);
|
|
409
|
+
const toolChoice = transformChatToolChoice(request.toolChoice);
|
|
410
|
+
if (toolChoice !== void 0) {
|
|
411
|
+
params.tool_choice = toolChoice;
|
|
412
|
+
}
|
|
413
|
+
if (request.parallelToolCalls !== void 0) {
|
|
414
|
+
params.parallel_tool_calls = request.parallelToolCalls;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
if (request.maxOutputTokens !== void 0) {
|
|
418
|
+
params.max_completion_tokens = request.maxOutputTokens;
|
|
419
|
+
}
|
|
420
|
+
if (request.temperature !== void 0) {
|
|
421
|
+
params.temperature = request.temperature;
|
|
422
|
+
}
|
|
423
|
+
if (request.topP !== void 0) {
|
|
424
|
+
params.top_p = request.topP;
|
|
425
|
+
}
|
|
426
|
+
if (request.stopSequences && request.stopSequences.length > 0) {
|
|
427
|
+
params.stop = request.stopSequences;
|
|
428
|
+
}
|
|
429
|
+
if (request.reasoning?.level !== void 0) {
|
|
430
|
+
const effort = mapCerebrasReasoningEffort(request.model, request.reasoning.level);
|
|
431
|
+
if (effort) {
|
|
432
|
+
params.reasoning_effort = effort;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
if (request.responseFormat?.type === "json") {
|
|
436
|
+
if (request.responseFormat.schema) {
|
|
437
|
+
params.response_format = {
|
|
438
|
+
type: "json_schema",
|
|
439
|
+
json_schema: {
|
|
440
|
+
name: "response",
|
|
441
|
+
schema: request.responseFormat.schema,
|
|
442
|
+
strict: true
|
|
443
|
+
}
|
|
444
|
+
};
|
|
445
|
+
} else {
|
|
446
|
+
params.response_format = { type: "json_object" };
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
if (request.providerOptions) {
|
|
450
|
+
const { _metadata, ...safeOptions } = request.providerOptions;
|
|
451
|
+
Object.assign(params, safeOptions);
|
|
452
|
+
}
|
|
453
|
+
return params;
|
|
454
|
+
}
|
|
455
|
+
function createChatErrorChunk(error, code) {
|
|
456
|
+
return { type: "error", error, code };
|
|
457
|
+
}
|
|
458
|
+
function isBase64Like(str) {
|
|
459
|
+
if (str.startsWith("data:")) return true;
|
|
460
|
+
if (str.length > 200) {
|
|
461
|
+
const base64Pattern = /^[A-Za-z0-9+/]+=*$/;
|
|
462
|
+
return base64Pattern.test(str.substring(0, 200));
|
|
463
|
+
}
|
|
464
|
+
return false;
|
|
465
|
+
}
|
|
466
|
+
function truncateBase64String(str, maxLength = 50) {
|
|
467
|
+
if (str.length <= maxLength) return str;
|
|
468
|
+
const preview = str.substring(0, maxLength);
|
|
469
|
+
return `${preview}...[truncated, ${str.length.toLocaleString()} chars]`;
|
|
470
|
+
}
|
|
471
|
+
function truncateChatBase64(obj, maxLength = 50) {
|
|
472
|
+
if (obj === null || obj === void 0) {
|
|
473
|
+
return obj;
|
|
474
|
+
}
|
|
475
|
+
if (typeof obj === "string") {
|
|
476
|
+
return isBase64Like(obj) ? truncateBase64String(obj, maxLength) : obj;
|
|
477
|
+
}
|
|
478
|
+
if (Array.isArray(obj)) {
|
|
479
|
+
return obj.map((item) => truncateChatBase64(item, maxLength));
|
|
480
|
+
}
|
|
481
|
+
if (typeof obj === "object") {
|
|
482
|
+
const result = {};
|
|
483
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
484
|
+
result[key] = truncateChatBase64(value, maxLength);
|
|
485
|
+
}
|
|
486
|
+
return result;
|
|
487
|
+
}
|
|
488
|
+
return obj;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
// src/icons.ts
|
|
492
|
+
var CEREBRAS_ICON = `
|
|
493
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
|
|
494
|
+
<defs>
|
|
495
|
+
<linearGradient id="cerebras-gradient" x1="12" y1="10" x2="52" y2="54" gradientUnits="userSpaceOnUse">
|
|
496
|
+
<stop stop-color="#F97316" />
|
|
497
|
+
<stop offset="1" stop-color="#EA580C" />
|
|
498
|
+
</linearGradient>
|
|
499
|
+
</defs>
|
|
500
|
+
<rect width="64" height="64" rx="16" fill="#111827" />
|
|
501
|
+
<path
|
|
502
|
+
d="M43.5 20.5C40.8 17.8 36.7 16 32 16C23.2 16 16 23.2 16 32C16 40.8 23.2 48 32 48C36.7 48 40.8 46.2 43.5 43.5"
|
|
503
|
+
stroke="url(#cerebras-gradient)"
|
|
504
|
+
stroke-width="6"
|
|
505
|
+
stroke-linecap="round"
|
|
506
|
+
/>
|
|
507
|
+
<path
|
|
508
|
+
d="M46.5 24.5L33.5 37.5L27.5 31.5"
|
|
509
|
+
stroke="url(#cerebras-gradient)"
|
|
510
|
+
stroke-width="5"
|
|
511
|
+
stroke-linecap="round"
|
|
512
|
+
stroke-linejoin="round"
|
|
513
|
+
/>
|
|
514
|
+
</svg>
|
|
515
|
+
`;
|
|
516
|
+
var META_ICON = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none">
|
|
517
|
+
<defs>
|
|
518
|
+
<linearGradient id="meta-grad-1" x1="61" y1="117" x2="259" y2="127" gradientUnits="userSpaceOnUse">
|
|
519
|
+
<stop offset="0" stop-color="#0064E1"/>
|
|
520
|
+
<stop offset="0.4" stop-color="#0064E1"/>
|
|
521
|
+
<stop offset="0.83" stop-color="#0073EE"/>
|
|
522
|
+
<stop offset="1" stop-color="#0082FB"/>
|
|
523
|
+
</linearGradient>
|
|
524
|
+
<linearGradient id="meta-grad-2" x1="45" y1="139" x2="45" y2="66" gradientUnits="userSpaceOnUse">
|
|
525
|
+
<stop offset="0" stop-color="#0082FB"/>
|
|
526
|
+
<stop offset="1" stop-color="#0064E0"/>
|
|
527
|
+
</linearGradient>
|
|
528
|
+
</defs>
|
|
529
|
+
<g transform="translate(0 16.6667) scale(0.3472222)">
|
|
530
|
+
<path fill="#0081FB" d="M31.06 125.96c0 10.98 2.41 19.41 5.56 24.51 4.13 6.68 10.29 9.51 16.57 9.51 8.1 0 15.51-2.01 29.79-21.76 11.44-15.83 24.92-38.05 33.99-51.98l15.36-23.6c10.67-16.39 23.02-34.61 37.18-46.96C181.07 5.6 193.54 0 206.09 0c21.07 0 41.14 12.21 56.5 35.11 16.81 25.08 24.97 56.67 24.97 89.27 0 19.38-3.82 33.62-10.32 44.87-6.28 10.88-18.52 21.75-39.11 21.75v-31.02c17.63 0 22.03-16.2 22.03-34.74 0-26.42-6.16-55.74-19.73-76.69-9.63-14.86-22.11-23.94-35.84-23.94-14.85 0-26.8 11.2-40.23 31.17-7.14 10.61-14.47 23.54-22.7 38.13l-9.06 16.05c-18.2 32.27-22.81 39.62-31.91 51.75C84.74 183.95 71.12 192 53.19 192c-21.27 0-34.72-9.21-43.05-23.09C3.34 157.6 0 142.76 0 125.85z"/>
|
|
531
|
+
<path fill="url(#meta-grad-1)" d="M24.49 37.3C38.73 15.35 59.28 0 82.85 0c13.65 0 27.22 4.04 41.39 15.61 15.5 12.65 32.02 33.48 52.63 67.81l7.39 12.32c17.84 29.72 27.99 45.01 33.93 52.22 7.64 9.26 12.99 12.02 19.94 12.02 17.63 0 22.03-16.2 22.03-34.74l27.4-.86c0 19.38-3.82 33.62-10.32 44.87-6.28 10.88-18.52 21.75-39.11 21.75-12.8 0-24.14-2.78-36.68-14.61-9.64-9.08-20.91-25.21-29.58-39.71l-25.79-43.08c-12.94-21.62-24.81-37.74-31.68-45.04-7.39-7.85-16.89-17.33-32.05-17.33-12.27 0-22.69 8.61-31.41 21.78z"/>
|
|
532
|
+
<path fill="url(#meta-grad-2)" d="M82.35 31.23c-12.27 0-22.69 8.61-31.41 21.78-12.33 18.61-19.88 46.33-19.88 72.95 0 10.98 2.41 19.41 5.56 24.51l-26.48 17.44C3.34 156.6 0 141.76 0 124.85c0-30.75 8.44-62.8 24.49-87.55C38.73 15.35 59.28 0 82.85 0z"/>
|
|
533
|
+
</g>
|
|
534
|
+
</svg>`;
|
|
535
|
+
var ALIBABA_ICON = `<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
|
|
536
|
+
<rect width="48" height="48" fill="#FF5A00"/>
|
|
537
|
+
<path d="M31.5 12c3 .2 6.2.7 8.6 2.7 1.9 1.6 2.7 4.2 2.3 6.6-.4 1.8-1.2 3.4-2.1 5-1.8 3.1-4 6-6.1 8.9-.4.5-.7 1.1-.6 1.7 0 .5.4.9.9 1.1.9.4 1.8.3 2.7.2 2.9-.3 5.6-1.2 8.4-2.1.2-.1.3.1.4.2-2.9 1.9-6 3.6-9.3 4.8-1.8.6-3.7 1.2-5.7 1-1-.1-2-.7-2.4-1.7-.4-1.3-.2-2.8.3-4 .9-1.9 2.2-3.6 3.5-5.3 2.1-2.8 4.3-5.5 6-8.6.6-1.1 1.1-2.4.6-3.6-.5-1.1-1.6-1.8-2.7-2.3-1.9-.8-3.9-1.4-5.9-1.9l.9.6c.7.5 1.4 1.1 2.1 1.6-2.6.5-5.3 1-7.9 1.7-3.9 1-7.8 2.3-11.6 3.7.4.7.7 1.5 1.1 2.2-.9 1-1.7 1.9-2.6 2.9 2.1.6 4.3.7 6.4.2 1.8-.4 3.5-1.3 4.9-2.5-.4-.5-.9-.8-1.4-1.2 1.7 0 3.2 1.5 3.2 3.2l-1 .1c-.1-.4-.2-.7-.3-1.1-1.9 1.7-4.4 2.8-6.9 3.1-2.2.3-4.5-.1-6.7-.8.1 1.3.3 2.6.4 3.9-1.2.5-2.3 1.1-3.3 2-.8.7-1.6 1.5-1.9 2.5-.3.9.2 1.9 1 2.4 1 .6 2.1.9 3.2 1 1.5.2 3 .2 4.4.1 2.9-.2 5.8-.8 8.6-1.5.3-.1.4.4.1.4-2.3 1.2-4.6 2.1-7.1 2.8-2.3.6-4.7.9-7.1 1-2.4-.1-5-.5-7-1.9-1.4-1.2-2.2-3-2.2-4.8v-.1c0-1.9.7-3.8 1.6-5.5 1.2-2.4 2.8-4.6 4.6-6.5 3.1-3.4 7-6.1 11.2-8 4.4-2 9-3.4 13.8-3.7z" fill="white"/>
|
|
538
|
+
</svg>`;
|
|
539
|
+
var ZAI_ICON = `<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
|
|
540
|
+
<rect width="48" height="48" rx="4" fill="#2D2D2D"/>
|
|
541
|
+
<path d="M35 10H13v4h14L13 34v4h22v-4H21l14-20V10z" fill="white"/>
|
|
542
|
+
</svg>`;
|
|
543
|
+
var OPENAI_ICON = `<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
|
|
544
|
+
<rect width="48" height="48" rx="24" fill="white"/>
|
|
545
|
+
<path d="M19.3418 18.5599V14.7599C19.3418 14.4399 19.4608 14.1998 19.7382 14.04L27.3102 9.63997C28.3409 9.03999 29.5699 8.76014 30.8383 8.76014C35.5954 8.76014 38.6085 12.4802 38.6085 16.4401C38.6085 16.72 38.6085 17.04 38.5687 17.3601L30.7194 12.72C30.2437 12.4401 29.7678 12.4401 29.2922 12.72L19.3418 18.5599ZM37.0226 33.36V24.2799C37.0226 23.7197 36.7846 23.3197 36.309 23.0398L26.3586 17.1998L29.6093 15.3197C29.8868 15.1599 30.1247 15.1599 30.4022 15.3197L37.9741 19.7197C40.1547 20.9999 41.6213 23.7197 41.6213 26.3596C41.6213 29.3995 39.8375 32.1999 37.0226 33.36ZM17.0029 25.3601L13.7522 23.4402C13.4748 23.2804 13.3557 23.0402 13.3557 22.7202V13.9203C13.3557 9.64039 16.6065 6.40016 21.0069 6.40016C22.6722 6.40016 24.2179 6.96029 25.5265 7.96025L17.7168 12.5204C17.2412 12.8003 17.0033 13.2002 17.0033 13.7605L17.0029 25.3601ZM24 29.44L19.3418 26.8001V21.2003L24 18.5604L28.6578 21.2003V26.8001L24 29.44ZM26.993 41.6002C25.3278 41.6002 23.7821 41.04 22.4735 40.0402L30.2831 35.4799C30.7588 35.2001 30.9967 34.8001 30.9967 34.2399V22.6399L34.2873 24.5598C34.5646 24.7196 34.6837 24.9597 34.6837 25.2798V34.0797C34.6837 38.3596 31.3931 41.6002 26.993 41.6002ZM17.5975 32.6802L10.0255 28.2803C7.84493 27.0001 6.37833 24.2803 6.37833 21.6404C6.37833 18.5604 8.20193 15.8004 11.0164 14.6403V23.7602C11.0164 24.3204 11.2544 24.7204 11.73 25.0003L21.641 30.8001L18.3902 32.6802C18.1129 32.84 17.8749 32.84 17.5975 32.6802ZM17.1617 39.2402C12.682 39.2402 9.39151 35.8402 9.39151 31.6401C9.39151 31.3201 9.43125 31.0001 9.47066 30.68L17.2803 35.2402C17.7559 35.5201 18.2319 35.5201 18.7074 35.2402L28.6578 29.4404V33.2404C28.6578 33.5605 28.5388 33.8005 28.2614 33.9604L20.6894 38.3604C19.6586 38.9603 18.4301 39.2402 17.1617 39.2402ZM26.993 44C31.7899 44 35.7936 40.5601 36.7057 36C41.1457 34.8399 44 30.6399 44 26.36C44 23.5598 42.8108 20.8401 40.6701 18.88C40.8683 18.0399 40.9872 17.1998 40.9872 16.3602C40.9872 10.6403 36.3885 6.35998 31.0763 6.35998C30.0062 6.35998 28.9754 6.51979 27.9446 6.88001C26.1604 5.11992 23.7025 4 21.0069 4C16.2101 4 12.2064 7.4398 11.2943 12C6.8543 13.1601 4 17.3601 4 21.6399C4 24.4401 5.18916 27.1599 7.32995 29.1199C7.13174 29.96 7.01277 30.8001 7.01277 31.6398C7.01277 37.3597 11.6114 41.6399 16.9236 41.6399C17.9938 41.6399 19.0246 41.4801 20.0554 41.1199C21.8392 42.88 24.2971 44 26.993 44Z" fill="black"/>
|
|
546
|
+
</svg>`;
|
|
547
|
+
var MODEL_ICON_PREFIXES = [
|
|
548
|
+
{ prefix: "llama", icon: META_ICON },
|
|
549
|
+
{ prefix: "gpt", icon: OPENAI_ICON },
|
|
550
|
+
{ prefix: "zai", icon: ZAI_ICON },
|
|
551
|
+
{ prefix: "qwen", icon: ALIBABA_ICON }
|
|
552
|
+
];
|
|
553
|
+
function svgToDataUri(svg) {
|
|
554
|
+
return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;
|
|
555
|
+
}
|
|
556
|
+
function getCerebrasIconDataUri() {
|
|
557
|
+
return svgToDataUri(CEREBRAS_ICON);
|
|
558
|
+
}
|
|
559
|
+
function getCerebrasModelIconDataUri(modelId) {
|
|
560
|
+
if (!modelId) return void 0;
|
|
561
|
+
const normalizedModelId = modelId.trim().toLowerCase();
|
|
562
|
+
const icon = MODEL_ICON_PREFIXES.find(({ prefix }) => normalizedModelId.startsWith(prefix))?.icon;
|
|
563
|
+
return icon ? svgToDataUri(icon) : void 0;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// src/CerebrasProvider.ts
|
|
567
|
+
var STATIC_MODELS = [
|
|
568
|
+
{
|
|
569
|
+
id: "llama3.1-8b",
|
|
570
|
+
name: "Llama 3.1 8B",
|
|
571
|
+
description: "Fast general-purpose Cerebras model.",
|
|
572
|
+
input_modalities: ["text"],
|
|
573
|
+
output_modalities: ["text"],
|
|
574
|
+
context_length: 32768,
|
|
575
|
+
max_output_length: 8192,
|
|
576
|
+
supported_features: ["tools", "json_mode", "structured_outputs"]
|
|
577
|
+
},
|
|
578
|
+
{
|
|
579
|
+
id: "qwen-3-235b-a22b-instruct-2507",
|
|
580
|
+
name: "Qwen 3 235B Instruct",
|
|
581
|
+
description: "Large instruct model with tool use and structured outputs.",
|
|
582
|
+
input_modalities: ["text"],
|
|
583
|
+
output_modalities: ["text"],
|
|
584
|
+
context_length: 131072,
|
|
585
|
+
max_output_length: 40960,
|
|
586
|
+
supported_features: ["tools", "json_mode", "structured_outputs"]
|
|
587
|
+
},
|
|
588
|
+
{
|
|
589
|
+
id: "gpt-oss-120b",
|
|
590
|
+
name: "GPT OSS 120B",
|
|
591
|
+
description: "Large reasoning-focused Cerebras model.",
|
|
592
|
+
input_modalities: ["text"],
|
|
593
|
+
output_modalities: ["text"],
|
|
594
|
+
context_length: 128e3,
|
|
595
|
+
max_output_length: 64e3,
|
|
596
|
+
supported_features: ["tools", "json_mode", "structured_outputs"],
|
|
597
|
+
capabilities: {
|
|
598
|
+
supportsImages: false,
|
|
599
|
+
supportsToolCalls: true,
|
|
600
|
+
supportsStreaming: true,
|
|
601
|
+
supportsJsonMode: true,
|
|
602
|
+
maxContextTokens: 128e3,
|
|
603
|
+
maxOutputTokens: 64e3,
|
|
604
|
+
reasoningLevels: { 0: null, 33: "low", 66: "medium", 100: "high" }
|
|
605
|
+
}
|
|
606
|
+
},
|
|
607
|
+
{
|
|
608
|
+
id: "zai-glm-4.7",
|
|
609
|
+
name: "Z.ai GLM 4.7",
|
|
610
|
+
description: "Preview Cerebras reasoning model with optional preserved thinking.",
|
|
611
|
+
input_modalities: ["text"],
|
|
612
|
+
output_modalities: ["text"],
|
|
613
|
+
context_length: 128e3,
|
|
614
|
+
max_output_length: 64e3,
|
|
615
|
+
supported_features: ["tools", "json_mode", "structured_outputs"],
|
|
616
|
+
capabilities: {
|
|
617
|
+
supportsImages: false,
|
|
618
|
+
supportsToolCalls: true,
|
|
619
|
+
supportsStreaming: true,
|
|
620
|
+
supportsJsonMode: true,
|
|
621
|
+
maxContextTokens: 128e3,
|
|
622
|
+
maxOutputTokens: 64e3,
|
|
623
|
+
reasoningLevels: { 0: "none", 100: null }
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
];
|
|
627
|
+
var CerebrasProvider = class _CerebrasProvider {
|
|
628
|
+
name = "cerebras";
|
|
629
|
+
specificationVersion = "1";
|
|
630
|
+
config;
|
|
631
|
+
static modelsCache = null;
|
|
632
|
+
static modelsCacheTime = 0;
|
|
633
|
+
static CACHE_TTL = 5 * 60 * 1e3;
|
|
634
|
+
constructor(config) {
|
|
635
|
+
this.config = config;
|
|
636
|
+
}
|
|
637
|
+
supportsModel(_modelId) {
|
|
638
|
+
return true;
|
|
639
|
+
}
|
|
640
|
+
getIcon(modelId) {
|
|
641
|
+
return getCerebrasModelIconDataUri(modelId) || getCerebrasIconDataUri();
|
|
642
|
+
}
|
|
643
|
+
async fetchModelsWithCache() {
|
|
644
|
+
const now = Date.now();
|
|
645
|
+
if (_CerebrasProvider.modelsCache && now - _CerebrasProvider.modelsCacheTime < _CerebrasProvider.CACHE_TTL) {
|
|
646
|
+
return _CerebrasProvider.modelsCache;
|
|
647
|
+
}
|
|
648
|
+
const response = await fetch("https://api.cerebras.ai/public/v1/models?format=openrouter");
|
|
649
|
+
if (!response.ok) {
|
|
650
|
+
throw new Error(`Cerebras public models API error: ${response.status}`);
|
|
651
|
+
}
|
|
652
|
+
const data = await response.json();
|
|
653
|
+
const merged = /* @__PURE__ */ new Map();
|
|
654
|
+
for (const model of STATIC_MODELS) {
|
|
655
|
+
merged.set(model.id, model);
|
|
656
|
+
}
|
|
657
|
+
for (const model of data.data || []) {
|
|
658
|
+
merged.set(model.id, { ...merged.get(model.id), ...model });
|
|
659
|
+
}
|
|
660
|
+
_CerebrasProvider.modelsCache = Array.from(merged.values());
|
|
661
|
+
_CerebrasProvider.modelsCacheTime = now;
|
|
662
|
+
return _CerebrasProvider.modelsCache;
|
|
663
|
+
}
|
|
664
|
+
mapModelCapabilities(model) {
|
|
665
|
+
const staticModel = STATIC_MODELS.find((candidate) => candidate.id === model.id);
|
|
666
|
+
if (staticModel?.capabilities) {
|
|
667
|
+
return { ...staticModel.capabilities };
|
|
668
|
+
}
|
|
669
|
+
const features = new Set(model.supported_features || []);
|
|
670
|
+
const inputModalities = new Set(model.input_modalities || []);
|
|
671
|
+
return {
|
|
672
|
+
supportsImages: inputModalities.has("image"),
|
|
673
|
+
supportsToolCalls: features.has("tools"),
|
|
674
|
+
supportsStreaming: true,
|
|
675
|
+
supportsJsonMode: features.has("json_mode") || features.has("structured_outputs"),
|
|
676
|
+
maxContextTokens: model.context_length,
|
|
677
|
+
maxOutputTokens: model.max_output_length
|
|
678
|
+
};
|
|
679
|
+
}
|
|
680
|
+
async getModelCapabilities(modelId) {
|
|
681
|
+
try {
|
|
682
|
+
const models = await this.fetchModelsWithCache();
|
|
683
|
+
const model = models.find((candidate) => candidate.id === modelId);
|
|
684
|
+
if (!model) return null;
|
|
685
|
+
return this.mapModelCapabilities(model);
|
|
686
|
+
} catch (error) {
|
|
687
|
+
console.error(`Failed to fetch capabilities for Cerebras model ${modelId}:`, error);
|
|
688
|
+
return null;
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
mapToProviderModelInfo(model) {
|
|
692
|
+
return {
|
|
693
|
+
id: model.id,
|
|
694
|
+
name: model.name || model.id,
|
|
695
|
+
description: model.description,
|
|
696
|
+
contextLength: model.context_length,
|
|
697
|
+
iconId: this.getIcon(model.id),
|
|
698
|
+
slug: model.openrouter?.slug || model.id
|
|
699
|
+
};
|
|
700
|
+
}
|
|
701
|
+
async getModels(filter) {
|
|
702
|
+
try {
|
|
703
|
+
let models = (await this.fetchModelsWithCache()).map((model) => this.mapToProviderModelInfo(model)).sort((a, b) => a.name.localeCompare(b.name));
|
|
704
|
+
if (filter) {
|
|
705
|
+
const lowerFilter = filter.toLowerCase();
|
|
706
|
+
models = models.filter(
|
|
707
|
+
(model) => model.id.toLowerCase().includes(lowerFilter) || model.name.toLowerCase().includes(lowerFilter) || model.description && model.description.toLowerCase().includes(lowerFilter)
|
|
708
|
+
);
|
|
709
|
+
}
|
|
710
|
+
return models;
|
|
711
|
+
} catch (error) {
|
|
712
|
+
console.error("Failed to fetch models from Cerebras:", error);
|
|
713
|
+
return STATIC_MODELS.map((model) => this.mapToProviderModelInfo(model));
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
async generate(request) {
|
|
717
|
+
const apiKey = this.config.apiKey;
|
|
718
|
+
const baseUrl = this.config.baseUrl || "https://api.cerebras.ai/v1";
|
|
719
|
+
try {
|
|
720
|
+
const response = await fetch(`${baseUrl}/chat/completions`, {
|
|
721
|
+
method: "POST",
|
|
722
|
+
headers: {
|
|
723
|
+
"Content-Type": "application/json",
|
|
724
|
+
"Authorization": `Bearer ${apiKey}`
|
|
725
|
+
},
|
|
726
|
+
body: JSON.stringify(buildChatParams(request)),
|
|
727
|
+
signal: request.signal
|
|
728
|
+
});
|
|
729
|
+
if (!response.ok) {
|
|
730
|
+
const errorText = await response.text();
|
|
731
|
+
let errorMessage = `Cerebras API error: ${response.status}`;
|
|
732
|
+
try {
|
|
733
|
+
const errorJson = JSON.parse(errorText);
|
|
734
|
+
errorMessage = errorJson.error?.message || errorJson.message || errorMessage;
|
|
735
|
+
} catch {
|
|
736
|
+
errorMessage = errorText || errorMessage;
|
|
737
|
+
}
|
|
738
|
+
throw this.toHttpProviderError(errorMessage, response.status, response.headers);
|
|
739
|
+
}
|
|
740
|
+
const data = await response.json();
|
|
741
|
+
return transformChatResponse(data);
|
|
742
|
+
} catch (error) {
|
|
743
|
+
throw this.toProviderError(error);
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
async stream(request) {
|
|
747
|
+
const self = this;
|
|
748
|
+
const apiKey = this.config.apiKey;
|
|
749
|
+
const baseUrl = this.config.baseUrl || "https://api.cerebras.ai/v1";
|
|
750
|
+
try {
|
|
751
|
+
const response = await fetch(`${baseUrl}/chat/completions`, {
|
|
752
|
+
method: "POST",
|
|
753
|
+
headers: {
|
|
754
|
+
"Content-Type": "application/json",
|
|
755
|
+
"Authorization": `Bearer ${apiKey}`
|
|
756
|
+
},
|
|
757
|
+
body: JSON.stringify({
|
|
758
|
+
...buildChatParams(request),
|
|
759
|
+
stream: true,
|
|
760
|
+
stream_options: { include_usage: true }
|
|
761
|
+
}),
|
|
762
|
+
signal: request.signal
|
|
763
|
+
});
|
|
764
|
+
if (!response.ok) {
|
|
765
|
+
const errorText = await response.text();
|
|
766
|
+
let errorMessage = `Cerebras API error: ${response.status}`;
|
|
767
|
+
try {
|
|
768
|
+
const errorJson = JSON.parse(errorText);
|
|
769
|
+
errorMessage = errorJson.error?.message || errorJson.message || errorMessage;
|
|
770
|
+
} catch {
|
|
771
|
+
errorMessage = errorText || errorMessage;
|
|
772
|
+
}
|
|
773
|
+
throw this.toHttpProviderError(errorMessage, response.status, response.headers);
|
|
774
|
+
}
|
|
775
|
+
return {
|
|
776
|
+
async *[Symbol.asyncIterator]() {
|
|
777
|
+
const state = createChatStreamState();
|
|
778
|
+
try {
|
|
779
|
+
for await (const chunk of parseChatSSEStream(response, state)) {
|
|
780
|
+
yield chunk;
|
|
781
|
+
}
|
|
782
|
+
} catch (error) {
|
|
783
|
+
const providerError = self.toProviderError(error);
|
|
784
|
+
yield createChatErrorChunk(providerError.message, providerError.code);
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
};
|
|
788
|
+
} catch (error) {
|
|
789
|
+
throw this.toProviderError(error);
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
toProviderError(error) {
|
|
793
|
+
if (error instanceof ProviderError) {
|
|
794
|
+
return error;
|
|
795
|
+
}
|
|
796
|
+
if (error instanceof Error) {
|
|
797
|
+
const anyError = error;
|
|
798
|
+
const status = anyError.status || anyError.statusCode;
|
|
799
|
+
const retryAfter = anyError.headers?.["retry-after"] ? parseInt(anyError.headers["retry-after"], 10) : void 0;
|
|
800
|
+
if (status === 429) {
|
|
801
|
+
return new ProviderError(error.message, "rate_limit", status, retryAfter);
|
|
802
|
+
}
|
|
803
|
+
if (status === 401 || status === 403) {
|
|
804
|
+
return new ProviderError(error.message, "auth_error", status);
|
|
805
|
+
}
|
|
806
|
+
if (status === 400) {
|
|
807
|
+
return new ProviderError(error.message, "invalid_request", status);
|
|
808
|
+
}
|
|
809
|
+
if (status && status >= 500) {
|
|
810
|
+
return new ProviderError(error.message, "server_error", status);
|
|
811
|
+
}
|
|
812
|
+
if (error.name === "AbortError" || anyError.code === "ETIMEDOUT") {
|
|
813
|
+
return new ProviderError(error.message, "timeout");
|
|
814
|
+
}
|
|
815
|
+
return new ProviderError(error.message, "unknown", status);
|
|
816
|
+
}
|
|
817
|
+
return new ProviderError(String(error), "unknown");
|
|
818
|
+
}
|
|
819
|
+
toHttpProviderError(message, status, headers) {
|
|
820
|
+
const retryAfterHeader = headers?.get("retry-after");
|
|
821
|
+
const retryAfter = retryAfterHeader ? parseInt(retryAfterHeader, 10) : void 0;
|
|
822
|
+
if (status === 429) {
|
|
823
|
+
return new ProviderError(message, "rate_limit", status, retryAfter);
|
|
824
|
+
}
|
|
825
|
+
if (status === 401 || status === 403) {
|
|
826
|
+
return new ProviderError(message, "auth_error", status);
|
|
827
|
+
}
|
|
828
|
+
if (status === 400) {
|
|
829
|
+
return new ProviderError(message, "invalid_request", status);
|
|
830
|
+
}
|
|
831
|
+
if (status >= 500) {
|
|
832
|
+
return new ProviderError(message, "server_error", status);
|
|
833
|
+
}
|
|
834
|
+
return new ProviderError(message, "unknown", status);
|
|
835
|
+
}
|
|
836
|
+
async inspectRequest(request) {
|
|
837
|
+
const params = buildChatParams(request);
|
|
838
|
+
return {
|
|
839
|
+
body: truncateChatBase64(params),
|
|
840
|
+
messagesPath: "messages",
|
|
841
|
+
metadata: {
|
|
842
|
+
endpoint: "POST /v1/chat/completions",
|
|
843
|
+
headers: {
|
|
844
|
+
"Content-Type": "application/json"
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
};
|
|
848
|
+
}
|
|
849
|
+
};
|
|
850
|
+
|
|
851
|
+
// src/providerOptions.ts
|
|
852
|
+
import { z } from "zod";
|
|
853
|
+
var cerebrasProviderOptions = z.object({
|
|
854
|
+
/**
|
|
855
|
+
* Clear reasoning from prior turns.
|
|
856
|
+
* Supported on `zai-glm-4.7`.
|
|
857
|
+
*/
|
|
858
|
+
clear_thinking: z.boolean().optional(),
|
|
859
|
+
/** Return token log probabilities. */
|
|
860
|
+
logprobs: z.boolean().optional(),
|
|
861
|
+
/** Number of top logprobs to return when `logprobs` is enabled. */
|
|
862
|
+
top_logprobs: z.number().int().min(0).max(20).optional(),
|
|
863
|
+
/** Sampling seed for best-effort determinism. */
|
|
864
|
+
seed: z.number().int().optional(),
|
|
865
|
+
/** End-user identifier for abuse monitoring. */
|
|
866
|
+
user: z.string().optional(),
|
|
867
|
+
/**
|
|
868
|
+
* Request prioritization.
|
|
869
|
+
* `priority` and some other tiers may require dedicated/private access.
|
|
870
|
+
*/
|
|
871
|
+
service_tier: z.enum(["priority", "default", "auto", "flex"]).optional(),
|
|
872
|
+
/**
|
|
873
|
+
* Override the model's reasoning behavior directly.
|
|
874
|
+
* The provider also maps Standard Agents `reasoning.level` automatically.
|
|
875
|
+
*/
|
|
876
|
+
reasoning_effort: z.enum(["none", "low", "medium", "high"]).optional()
|
|
877
|
+
}).passthrough();
|
|
878
|
+
|
|
879
|
+
// src/index.ts
|
|
880
|
+
var cerebras = Object.assign(
|
|
881
|
+
(config) => new CerebrasProvider(config),
|
|
882
|
+
{ providerOptions: cerebrasProviderOptions }
|
|
883
|
+
);
|
|
884
|
+
export {
|
|
885
|
+
CerebrasProvider,
|
|
886
|
+
cerebras,
|
|
887
|
+
cerebrasProviderOptions
|
|
888
|
+
};
|
|
889
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/CerebrasProvider.ts","../src/chat-completions-transformers.ts","../src/icons.ts","../src/providerOptions.ts","../src/index.ts"],"sourcesContent":["import type {\n LLMProviderInterface as Provider,\n ProviderFactoryConfig,\n ProviderRequest,\n ProviderResponse,\n ProviderStreamChunk,\n ModelCapabilities,\n ProviderModelInfo,\n InspectedRequest,\n} from '@standardagents/spec';\nimport { ProviderError } from '@standardagents/spec';\nimport {\n buildChatParams,\n transformChatResponse,\n createChatStreamState,\n parseChatSSEStream,\n createChatErrorChunk,\n truncateChatBase64,\n} from './chat-completions-transformers';\nimport { getCerebrasIconDataUri, getCerebrasModelIconDataUri } from './icons';\n\nexport { ProviderError };\n\ninterface CerebrasPublicModelInfo {\n id: string;\n name?: string;\n description?: string;\n input_modalities?: string[];\n output_modalities?: string[];\n context_length?: number;\n max_output_length?: number;\n pricing?: {\n prompt?: string;\n completion?: string;\n };\n supported_sampling_parameters?: string[];\n supported_features?: string[];\n openrouter?: {\n slug?: string;\n };\n}\n\nconst STATIC_MODELS: Array<CerebrasPublicModelInfo & {\n capabilities?: ModelCapabilities;\n}> = [\n {\n id: 'llama3.1-8b',\n name: 'Llama 3.1 8B',\n description: 'Fast general-purpose Cerebras model.',\n input_modalities: ['text'],\n output_modalities: ['text'],\n context_length: 32768,\n max_output_length: 8192,\n supported_features: ['tools', 'json_mode', 'structured_outputs'],\n },\n {\n id: 'qwen-3-235b-a22b-instruct-2507',\n name: 'Qwen 3 235B Instruct',\n description: 'Large instruct model with tool use and structured outputs.',\n input_modalities: ['text'],\n output_modalities: ['text'],\n context_length: 131072,\n max_output_length: 40960,\n supported_features: ['tools', 'json_mode', 'structured_outputs'],\n },\n {\n id: 'gpt-oss-120b',\n name: 'GPT OSS 120B',\n description: 'Large reasoning-focused Cerebras model.',\n input_modalities: ['text'],\n output_modalities: ['text'],\n context_length: 128000,\n max_output_length: 64000,\n supported_features: ['tools', 'json_mode', 'structured_outputs'],\n capabilities: {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 128000,\n maxOutputTokens: 64000,\n reasoningLevels: { 0: null, 33: 'low', 66: 'medium', 100: 'high' },\n },\n },\n {\n id: 'zai-glm-4.7',\n name: 'Z.ai GLM 4.7',\n description: 'Preview Cerebras reasoning model with optional preserved thinking.',\n input_modalities: ['text'],\n output_modalities: ['text'],\n context_length: 128000,\n max_output_length: 64000,\n supported_features: ['tools', 'json_mode', 'structured_outputs'],\n capabilities: {\n supportsImages: false,\n supportsToolCalls: true,\n supportsStreaming: true,\n supportsJsonMode: true,\n maxContextTokens: 128000,\n maxOutputTokens: 64000,\n reasoningLevels: { 0: 'none', 100: null },\n },\n },\n];\n\nexport class CerebrasProvider implements Provider {\n readonly name = 'cerebras';\n readonly specificationVersion = '1' as const;\n\n private config: ProviderFactoryConfig;\n\n private static modelsCache: CerebrasPublicModelInfo[] | null = null;\n private static modelsCacheTime = 0;\n private static readonly CACHE_TTL = 5 * 60 * 1000;\n\n constructor(config: ProviderFactoryConfig) {\n this.config = config;\n }\n\n supportsModel(_modelId: string): boolean {\n return true;\n }\n\n getIcon(modelId?: string): string {\n return getCerebrasModelIconDataUri(modelId) || getCerebrasIconDataUri();\n }\n\n private async fetchModelsWithCache(): Promise<CerebrasPublicModelInfo[]> {\n const now = Date.now();\n\n if (\n CerebrasProvider.modelsCache &&\n now - CerebrasProvider.modelsCacheTime < CerebrasProvider.CACHE_TTL\n ) {\n return CerebrasProvider.modelsCache;\n }\n\n const response = await fetch('https://api.cerebras.ai/public/v1/models?format=openrouter');\n if (!response.ok) {\n throw new Error(`Cerebras public models API error: ${response.status}`);\n }\n\n const data = await response.json() as { data?: CerebrasPublicModelInfo[] };\n const merged = new Map<string, CerebrasPublicModelInfo>();\n\n for (const model of STATIC_MODELS) {\n merged.set(model.id, model);\n }\n\n for (const model of data.data || []) {\n merged.set(model.id, { ...merged.get(model.id), ...model });\n }\n\n CerebrasProvider.modelsCache = Array.from(merged.values());\n CerebrasProvider.modelsCacheTime = now;\n\n return CerebrasProvider.modelsCache;\n }\n\n private mapModelCapabilities(model: CerebrasPublicModelInfo): ModelCapabilities {\n const staticModel = STATIC_MODELS.find((candidate) => candidate.id === model.id);\n if (staticModel?.capabilities) {\n return { ...staticModel.capabilities };\n }\n\n const features = new Set(model.supported_features || []);\n const inputModalities = new Set(model.input_modalities || []);\n\n return {\n supportsImages: inputModalities.has('image'),\n supportsToolCalls: features.has('tools'),\n supportsStreaming: true,\n supportsJsonMode: features.has('json_mode') || features.has('structured_outputs'),\n maxContextTokens: model.context_length,\n maxOutputTokens: model.max_output_length,\n };\n }\n\n async getModelCapabilities(modelId: string): Promise<ModelCapabilities | null> {\n try {\n const models = await this.fetchModelsWithCache();\n const model = models.find((candidate) => candidate.id === modelId);\n if (!model) return null;\n return this.mapModelCapabilities(model);\n } catch (error) {\n console.error(`Failed to fetch capabilities for Cerebras model ${modelId}:`, error);\n return null;\n }\n }\n\n private mapToProviderModelInfo(model: CerebrasPublicModelInfo): ProviderModelInfo {\n return {\n id: model.id,\n name: model.name || model.id,\n description: model.description,\n contextLength: model.context_length,\n iconId: this.getIcon(model.id),\n slug: model.openrouter?.slug || model.id,\n };\n }\n\n async getModels(filter?: string): Promise<ProviderModelInfo[]> {\n try {\n let models = (await this.fetchModelsWithCache())\n .map((model) => this.mapToProviderModelInfo(model))\n .sort((a, b) => a.name.localeCompare(b.name));\n\n if (filter) {\n const lowerFilter = filter.toLowerCase();\n models = models.filter(\n (model) =>\n model.id.toLowerCase().includes(lowerFilter) ||\n model.name.toLowerCase().includes(lowerFilter) ||\n (model.description && model.description.toLowerCase().includes(lowerFilter))\n );\n }\n\n return models;\n } catch (error) {\n console.error('Failed to fetch models from Cerebras:', error);\n return STATIC_MODELS.map((model) => this.mapToProviderModelInfo(model));\n }\n }\n\n async generate(request: ProviderRequest): Promise<ProviderResponse> {\n const apiKey = this.config.apiKey;\n const baseUrl = this.config.baseUrl || 'https://api.cerebras.ai/v1';\n\n try {\n const response = await fetch(`${baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify(buildChatParams(request)),\n signal: request.signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage = `Cerebras API error: ${response.status}`;\n try {\n const errorJson = JSON.parse(errorText) as {\n error?: { message?: string };\n message?: string;\n };\n errorMessage = errorJson.error?.message || errorJson.message || errorMessage;\n } catch {\n errorMessage = errorText || errorMessage;\n }\n\n throw this.toHttpProviderError(errorMessage, response.status, response.headers);\n }\n\n const data = await response.json();\n return transformChatResponse(data);\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n async stream(request: ProviderRequest): Promise<AsyncIterable<ProviderStreamChunk>> {\n const self = this;\n const apiKey = this.config.apiKey;\n const baseUrl = this.config.baseUrl || 'https://api.cerebras.ai/v1';\n\n try {\n const response = await fetch(`${baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n ...buildChatParams(request),\n stream: true,\n stream_options: { include_usage: true },\n }),\n signal: request.signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage = `Cerebras API error: ${response.status}`;\n try {\n const errorJson = JSON.parse(errorText) as {\n error?: { message?: string };\n message?: string;\n };\n errorMessage = errorJson.error?.message || errorJson.message || errorMessage;\n } catch {\n errorMessage = errorText || errorMessage;\n }\n\n throw this.toHttpProviderError(errorMessage, response.status, response.headers);\n }\n\n return {\n async *[Symbol.asyncIterator]() {\n const state = createChatStreamState();\n\n try {\n for await (const chunk of parseChatSSEStream(response, state)) {\n yield chunk;\n }\n } catch (error) {\n const providerError = self.toProviderError(error);\n yield createChatErrorChunk(providerError.message, providerError.code);\n }\n },\n };\n } catch (error) {\n throw this.toProviderError(error);\n }\n }\n\n private toProviderError(error: unknown): ProviderError {\n if (error instanceof ProviderError) {\n return error;\n }\n\n if (error instanceof Error) {\n const anyError = error as Error & {\n status?: number;\n statusCode?: number;\n headers?: Record<string, string>;\n code?: string;\n };\n\n const status = anyError.status || anyError.statusCode;\n const retryAfter = anyError.headers?.['retry-after']\n ? parseInt(anyError.headers['retry-after'], 10)\n : undefined;\n\n if (status === 429) {\n return new ProviderError(error.message, 'rate_limit', status, retryAfter);\n }\n if (status === 401 || status === 403) {\n return new ProviderError(error.message, 'auth_error', status);\n }\n if (status === 400) {\n return new ProviderError(error.message, 'invalid_request', status);\n }\n if (status && status >= 500) {\n return new ProviderError(error.message, 'server_error', status);\n }\n if (error.name === 'AbortError' || anyError.code === 'ETIMEDOUT') {\n return new ProviderError(error.message, 'timeout');\n }\n\n return new ProviderError(error.message, 'unknown', status);\n }\n\n return new ProviderError(String(error), 'unknown');\n }\n\n private toHttpProviderError(\n message: string,\n status: number,\n headers?: Headers\n ): ProviderError {\n const retryAfterHeader = headers?.get('retry-after');\n const retryAfter = retryAfterHeader ? parseInt(retryAfterHeader, 10) : undefined;\n\n if (status === 429) {\n return new ProviderError(message, 'rate_limit', status, retryAfter);\n }\n if (status === 401 || status === 403) {\n return new ProviderError(message, 'auth_error', status);\n }\n if (status === 400) {\n return new ProviderError(message, 'invalid_request', status);\n }\n if (status >= 500) {\n return new ProviderError(message, 'server_error', status);\n }\n\n return new ProviderError(message, 'unknown', status);\n }\n\n async inspectRequest(request: ProviderRequest): Promise<InspectedRequest> {\n const params = buildChatParams(request);\n\n return {\n body: truncateChatBase64(params as Record<string, unknown>),\n messagesPath: 'messages',\n metadata: {\n endpoint: 'POST /v1/chat/completions',\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n };\n }\n}\n","import type {\n ProviderRequest,\n ProviderResponse,\n ProviderMessage,\n ProviderTool,\n ProviderToolCallPart,\n ProviderFinishReason,\n ProviderUsage,\n ProviderStreamChunk,\n ContentPart,\n ProviderReasoningDetail,\n} from '@standardagents/spec';\n\nexport type CerebrasChatContentPart =\n | { type: 'text'; text: string }\n | { type: 'image_url'; image_url: { url: string; detail?: 'auto' | 'low' | 'high' } };\n\nexport type CerebrasChatMessage =\n | { role: 'system'; content: string }\n | { role: 'user'; content: string | CerebrasChatContentPart[] }\n | {\n role: 'assistant';\n content?: string | null;\n tool_calls?: CerebrasChatToolCall[];\n reasoning?: string | null;\n }\n | { role: 'tool'; tool_call_id: string; content: string };\n\nexport interface CerebrasChatToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface CerebrasChatTool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n strict?: boolean;\n };\n}\n\nexport type CerebrasChatToolChoice =\n | 'auto'\n | 'none'\n | 'required'\n | { type: 'function'; function: { name: string } };\n\nexport interface CerebrasChatCompletionRequest {\n model: string;\n messages: CerebrasChatMessage[];\n tools?: CerebrasChatTool[];\n tool_choice?: CerebrasChatToolChoice;\n parallel_tool_calls?: boolean;\n max_completion_tokens?: number;\n temperature?: number;\n top_p?: number;\n stop?: string[];\n stream?: boolean;\n stream_options?: { include_usage?: boolean };\n reasoning_effort?: 'none' | 'low' | 'medium' | 'high';\n clear_thinking?: boolean;\n logprobs?: boolean;\n top_logprobs?: number;\n seed?: number;\n user?: string;\n service_tier?: 'priority' | 'default' | 'auto' | 'flex';\n response_format?:\n | { type: 'json_object' }\n | { type: 'json_schema'; json_schema: { name: string; schema: Record<string, unknown>; strict?: boolean } };\n [key: string]: unknown;\n}\n\nexport interface CerebrasChatCompletionUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n completion_tokens_details?: {\n reasoning_tokens?: number;\n accepted_prediction_tokens?: number;\n rejected_prediction_tokens?: number;\n };\n}\n\nexport interface CerebrasChatCompletionResponse {\n id: string;\n model?: string;\n service_tier_used?: string;\n system_fingerprint?: string;\n time_info?: Record<string, unknown>;\n choices: Array<{\n index: number;\n message: {\n role: 'assistant';\n content: string | null;\n reasoning?: string | null;\n tool_calls?: CerebrasChatToolCall[];\n };\n finish_reason: string;\n }>;\n usage?: CerebrasChatCompletionUsage;\n}\n\nexport interface CerebrasChatStreamChunk {\n id?: string;\n model?: string;\n choices?: Array<{\n index: number;\n delta: {\n role?: string;\n content?: string | null;\n reasoning?: string | null;\n tool_calls?: Array<{\n index: number;\n id?: string;\n type?: 'function';\n function?: {\n name?: string;\n arguments?: string;\n };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: CerebrasChatCompletionUsage;\n}\n\nexport function transformChatContentPart(part: ContentPart): CerebrasChatContentPart {\n if (part.type === 'text') {\n return { type: 'text', text: part.text };\n }\n\n if (part.type === 'image') {\n const data = part.data || '';\n const imageUrl = data.startsWith('data:')\n ? data\n : `data:${part.mediaType || 'image/png'};base64,${data}`;\n\n return {\n type: 'image_url',\n image_url: {\n url: imageUrl,\n detail: part.detail || 'auto',\n },\n };\n }\n\n if (part.type === 'image_url') {\n return {\n type: 'image_url',\n image_url: {\n url: part.image_url?.url || '',\n detail: part.image_url?.detail || 'auto',\n },\n };\n }\n\n return {\n type: 'text',\n text: `[File: ${part.filename || 'file'}]`,\n };\n}\n\nexport function transformChatMessageContent(\n content: string | ContentPart[]\n): string | CerebrasChatContentPart[] {\n if (typeof content === 'string') {\n return content;\n }\n return content.map(transformChatContentPart);\n}\n\nexport function transformChatSystemMessage(\n msg: ProviderMessage & { role: 'system' }\n): CerebrasChatMessage {\n return {\n role: 'system',\n content: msg.content,\n };\n}\n\nexport function transformChatUserMessage(\n msg: ProviderMessage & { role: 'user' }\n): CerebrasChatMessage {\n return {\n role: 'user',\n content: transformChatMessageContent(msg.content),\n };\n}\n\nexport function transformChatAssistantMessage(\n msg: ProviderMessage & { role: 'assistant' }\n): CerebrasChatMessage {\n const message: CerebrasChatMessage & { role: 'assistant' } = {\n role: 'assistant',\n content: msg.content || null,\n };\n\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n message.tool_calls = msg.toolCalls.map((tc) => ({\n id: tc.id,\n type: 'function',\n function: {\n name: tc.name,\n arguments: typeof tc.arguments === 'string'\n ? tc.arguments\n : JSON.stringify(tc.arguments),\n },\n }));\n }\n\n if (msg.reasoning) {\n message.reasoning = msg.reasoning;\n }\n\n return message;\n}\n\nexport type CerebrasChatToolMessageResult = {\n toolMessage: CerebrasChatMessage & { role: 'tool' };\n syntheticUserMessage?: CerebrasChatMessage & { role: 'user' };\n};\n\nexport function transformChatToolMessage(\n msg: ProviderMessage & { role: 'tool' }\n): CerebrasChatToolMessageResult {\n let output: string;\n\n if (typeof msg.content === 'string') {\n output = msg.content;\n } else if ('type' in msg.content) {\n if (msg.content.type === 'text') {\n output = msg.content.text;\n } else if (msg.content.type === 'error') {\n output = `Error: ${msg.content.error}`;\n } else {\n output = JSON.stringify(msg.content);\n }\n } else {\n output = JSON.stringify(msg.content);\n }\n\n const imageAttachments = msg.attachments?.filter(a => a.type === 'image' && a.data) || [];\n const toolMessage: CerebrasChatMessage & { role: 'tool' } = {\n role: 'tool',\n tool_call_id: msg.toolCallId,\n content: output || (imageAttachments.length > 0 ? 'Success' : ''),\n };\n\n if (imageAttachments.length === 0) {\n return { toolMessage };\n }\n\n const imageContent: CerebrasChatContentPart[] = [];\n const toolName = msg.toolName || 'the tool';\n const isSingle = imageAttachments.length === 1;\n const descriptor = isSingle ? 'the file' : `${imageAttachments.length} files`;\n const verb = isSingle ? 'is' : 'are';\n\n imageContent.push({\n type: 'text',\n text: `Here ${verb} ${descriptor} from ${toolName}:`,\n });\n\n for (const attachment of imageAttachments) {\n const attachmentData = attachment.data || '';\n const imageData = attachmentData.startsWith('data:')\n ? attachmentData\n : `data:${attachment.mediaType || 'image/png'};base64,${attachmentData}`;\n\n imageContent.push({\n type: 'image_url',\n image_url: {\n url: imageData,\n detail: 'auto',\n },\n });\n }\n\n return {\n toolMessage,\n syntheticUserMessage: {\n role: 'user',\n content: imageContent,\n },\n };\n}\n\nexport function transformChatMessages(messages: ProviderMessage[]): CerebrasChatMessage[] {\n const result: CerebrasChatMessage[] = [];\n\n for (const msg of messages) {\n switch (msg.role) {\n case 'system':\n result.push(transformChatSystemMessage(msg));\n break;\n case 'user':\n result.push(transformChatUserMessage(msg));\n break;\n case 'assistant':\n result.push(transformChatAssistantMessage(msg));\n break;\n case 'tool': {\n const { toolMessage, syntheticUserMessage } = transformChatToolMessage(msg);\n result.push(toolMessage);\n if (syntheticUserMessage) {\n result.push(syntheticUserMessage);\n }\n break;\n }\n }\n }\n\n return result;\n}\n\nexport function transformChatTool(tool: ProviderTool): CerebrasChatTool {\n const inputParams = tool.function.parameters as Record<string, unknown> | null | undefined;\n\n const parameters = inputParams && typeof inputParams === 'object'\n ? {\n ...inputParams,\n additionalProperties: false,\n }\n : {\n type: 'object',\n properties: {},\n required: [],\n additionalProperties: false,\n };\n\n return {\n type: 'function',\n function: {\n name: tool.function.name,\n description: tool.function.description || undefined,\n parameters,\n strict: true,\n },\n };\n}\n\nexport function transformChatTools(tools: ProviderTool[]): CerebrasChatTool[] {\n return tools.map(transformChatTool);\n}\n\nexport function transformChatToolChoice(\n choice: ProviderRequest['toolChoice']\n): CerebrasChatToolChoice | undefined {\n if (choice === 'auto') return 'auto';\n if (choice === 'none') return 'none';\n if (choice === 'required') return 'required';\n if (typeof choice === 'object' && 'name' in choice) {\n return { type: 'function', function: { name: choice.name } };\n }\n return undefined;\n}\n\nexport function mapChatFinishReason(finishReason: string | null | undefined): ProviderFinishReason {\n switch (finishReason) {\n case 'stop':\n return 'stop';\n case 'tool_calls':\n return 'tool_calls';\n case 'length':\n return 'length';\n case 'content_filter':\n return 'content_filter';\n case 'error':\n return 'error';\n default:\n return 'stop';\n }\n}\n\nexport function extractChatToolCalls(\n toolCalls: CerebrasChatToolCall[] | undefined\n): ProviderToolCallPart[] | undefined {\n if (!toolCalls || toolCalls.length === 0) {\n return undefined;\n }\n\n return toolCalls.map((tc) => {\n let parsedArgs: Record<string, unknown> = {};\n try {\n parsedArgs = tc.function.arguments ? JSON.parse(tc.function.arguments) : {};\n } catch {\n parsedArgs = {};\n }\n\n return {\n id: tc.id,\n name: tc.function.name,\n arguments: parsedArgs,\n };\n });\n}\n\nexport function transformChatUsage(\n usage: CerebrasChatCompletionUsage | null | undefined\n): ProviderUsage {\n if (!usage) {\n return {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n }\n\n return {\n promptTokens: usage.prompt_tokens || 0,\n completionTokens: usage.completion_tokens || 0,\n totalTokens: usage.total_tokens || 0,\n reasoningTokens: usage.completion_tokens_details?.reasoning_tokens,\n cachedTokens: usage.prompt_tokens_details?.cached_tokens,\n };\n}\n\nexport function transformChatResponse(response: CerebrasChatCompletionResponse): ProviderResponse {\n const choice = response.choices?.[0];\n const message = choice?.message;\n const reasoning = message?.reasoning || null;\n\n return {\n content: message?.content || null,\n reasoning,\n reasoningDetails: reasoning ? [{ type: 'text', text: reasoning }] : undefined,\n toolCalls: extractChatToolCalls(message?.tool_calls),\n finishReason: mapChatFinishReason(choice?.finish_reason),\n usage: transformChatUsage(response.usage),\n metadata: {\n model: response.model,\n provider: 'cerebras',\n requestId: response.id,\n serviceTierUsed: response.service_tier_used,\n systemFingerprint: response.system_fingerprint,\n timeInfo: response.time_info,\n },\n };\n}\n\nexport interface CerebrasChatStreamState {\n content: string;\n toolCalls: Map<number, { id: string; name: string; arguments: string }>;\n reasoningContent: string;\n hasContent: boolean;\n hasReasoning: boolean;\n finishReason: string | null;\n}\n\nexport function createChatStreamState(): CerebrasChatStreamState {\n return {\n content: '',\n toolCalls: new Map(),\n reasoningContent: '',\n hasContent: false,\n hasReasoning: false,\n finishReason: null,\n };\n}\n\nexport function processChatStreamChunk(\n chunk: CerebrasChatStreamChunk,\n state: CerebrasChatStreamState\n): ProviderStreamChunk[] {\n const chunks: ProviderStreamChunk[] = [];\n const choice = chunk.choices?.[0];\n const delta = choice?.delta;\n\n if (!delta && !choice?.finish_reason && !chunk.usage) {\n return chunks;\n }\n\n if (delta?.content) {\n state.hasContent = true;\n state.content += delta.content;\n chunks.push({ type: 'content-delta', delta: delta.content });\n }\n\n if (delta?.reasoning) {\n state.hasReasoning = true;\n state.reasoningContent += delta.reasoning;\n chunks.push({ type: 'reasoning-delta', delta: delta.reasoning });\n }\n\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const existing = state.toolCalls.get(tc.index);\n\n if (tc.id && tc.function?.name) {\n state.toolCalls.set(tc.index, {\n id: tc.id,\n name: tc.function.name,\n arguments: tc.function.arguments || '',\n });\n chunks.push({\n type: 'tool-call-start',\n id: tc.id,\n name: tc.function.name,\n });\n } else if (existing && tc.function?.arguments) {\n existing.arguments += tc.function.arguments;\n chunks.push({\n type: 'tool-call-delta',\n id: existing.id,\n argumentsDelta: tc.function.arguments,\n });\n }\n }\n }\n\n if (choice?.finish_reason) {\n state.finishReason = choice.finish_reason;\n\n if (state.hasContent) {\n chunks.push({ type: 'content-done' });\n }\n\n if (state.hasReasoning) {\n chunks.push({ type: 'reasoning-done' });\n }\n\n for (const tc of state.toolCalls.values()) {\n let parsedArgs: Record<string, unknown> = {};\n try {\n parsedArgs = tc.arguments ? JSON.parse(tc.arguments) : {};\n } catch {\n parsedArgs = {};\n }\n\n chunks.push({\n type: 'tool-call-done',\n id: tc.id,\n arguments: parsedArgs,\n });\n }\n }\n\n if (chunk.usage) {\n const reasoningDetails: ProviderReasoningDetail[] | undefined = state.reasoningContent\n ? [{ type: 'text', text: state.reasoningContent }]\n : undefined;\n\n chunks.push({\n type: 'finish',\n finishReason: mapChatFinishReason(state.finishReason),\n usage: transformChatUsage(chunk.usage),\n reasoningDetails,\n });\n }\n\n return chunks;\n}\n\nexport function parseChatStreamEvent(jsonStr: string): CerebrasChatStreamChunk | null {\n try {\n return JSON.parse(jsonStr) as CerebrasChatStreamChunk;\n } catch {\n return null;\n }\n}\n\nexport async function* parseChatSSEStream(\n response: Response,\n state: CerebrasChatStreamState\n): AsyncIterable<ProviderStreamChunk> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n if (!trimmed.startsWith('data: ')) continue;\n\n const data = trimmed.slice(6);\n if (data === '[DONE]') continue;\n\n const chunk = parseChatStreamEvent(data);\n if (!chunk) continue;\n\n for (const providerChunk of processChatStreamChunk(chunk, state)) {\n yield providerChunk;\n }\n }\n }\n\n if (buffer.trim()) {\n const trimmed = buffer.trim();\n if (trimmed.startsWith('data: ')) {\n const data = trimmed.slice(6);\n if (data !== '[DONE]') {\n const chunk = parseChatStreamEvent(data);\n if (chunk) {\n for (const providerChunk of processChatStreamChunk(chunk, state)) {\n yield providerChunk;\n }\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction mapCerebrasReasoningEffort(\n model: string,\n level: number\n): 'none' | 'low' | 'medium' | 'high' | undefined {\n if (model.startsWith('gpt-oss-')) {\n if (level >= 100) return 'high';\n if (level >= 66) return 'medium';\n if (level >= 33) return 'low';\n if (level > 0) return 'low';\n return undefined;\n }\n\n if (model.startsWith('zai-glm-4.7')) {\n return level === 0 ? 'none' : undefined;\n }\n\n return undefined;\n}\n\nexport function buildChatParams(request: ProviderRequest): CerebrasChatCompletionRequest {\n const params: CerebrasChatCompletionRequest = {\n model: request.model,\n messages: transformChatMessages(request.messages),\n };\n\n if (request.tools && request.tools.length > 0) {\n params.tools = transformChatTools(request.tools);\n\n const toolChoice = transformChatToolChoice(request.toolChoice);\n if (toolChoice !== undefined) {\n params.tool_choice = toolChoice;\n }\n\n if (request.parallelToolCalls !== undefined) {\n params.parallel_tool_calls = request.parallelToolCalls;\n }\n }\n\n if (request.maxOutputTokens !== undefined) {\n params.max_completion_tokens = request.maxOutputTokens;\n }\n\n if (request.temperature !== undefined) {\n params.temperature = request.temperature;\n }\n\n if (request.topP !== undefined) {\n params.top_p = request.topP;\n }\n\n if (request.stopSequences && request.stopSequences.length > 0) {\n params.stop = request.stopSequences;\n }\n\n if (request.reasoning?.level !== undefined) {\n const effort = mapCerebrasReasoningEffort(request.model, request.reasoning.level);\n if (effort) {\n params.reasoning_effort = effort;\n }\n }\n\n if (request.responseFormat?.type === 'json') {\n if (request.responseFormat.schema) {\n params.response_format = {\n type: 'json_schema',\n json_schema: {\n name: 'response',\n schema: request.responseFormat.schema,\n strict: true,\n },\n };\n } else {\n params.response_format = { type: 'json_object' };\n }\n }\n\n if (request.providerOptions) {\n const { _metadata, ...safeOptions } = request.providerOptions as Record<string, unknown> & {\n _metadata?: unknown;\n };\n Object.assign(params, safeOptions);\n }\n\n return params;\n}\n\nexport function createChatErrorChunk(error: string, code?: string): ProviderStreamChunk {\n return { type: 'error', error, code };\n}\n\nfunction isBase64Like(str: string): boolean {\n if (str.startsWith('data:')) return true;\n if (str.length > 200) {\n const base64Pattern = /^[A-Za-z0-9+/]+=*$/;\n return base64Pattern.test(str.substring(0, 200));\n }\n return false;\n}\n\nfunction truncateBase64String(str: string, maxLength: number = 50): string {\n if (str.length <= maxLength) return str;\n const preview = str.substring(0, maxLength);\n return `${preview}...[truncated, ${str.length.toLocaleString()} chars]`;\n}\n\nexport function truncateChatBase64<T>(obj: T, maxLength: number = 50): T {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj === 'string') {\n return (isBase64Like(obj) ? truncateBase64String(obj, maxLength) : obj) as T;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => truncateChatBase64(item, maxLength)) as T;\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = truncateChatBase64(value, maxLength);\n }\n return result as T;\n }\n\n return obj;\n}\n","const CEREBRAS_ICON = `\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\" fill=\"none\">\n <defs>\n <linearGradient id=\"cerebras-gradient\" x1=\"12\" y1=\"10\" x2=\"52\" y2=\"54\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#F97316\" />\n <stop offset=\"1\" stop-color=\"#EA580C\" />\n </linearGradient>\n </defs>\n <rect width=\"64\" height=\"64\" rx=\"16\" fill=\"#111827\" />\n <path\n d=\"M43.5 20.5C40.8 17.8 36.7 16 32 16C23.2 16 16 23.2 16 32C16 40.8 23.2 48 32 48C36.7 48 40.8 46.2 43.5 43.5\"\n stroke=\"url(#cerebras-gradient)\"\n stroke-width=\"6\"\n stroke-linecap=\"round\"\n />\n <path\n d=\"M46.5 24.5L33.5 37.5L27.5 31.5\"\n stroke=\"url(#cerebras-gradient)\"\n stroke-width=\"5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n</svg>\n`;\n\nconst META_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\" fill=\"none\">\n<defs>\n<linearGradient id=\"meta-grad-1\" x1=\"61\" y1=\"117\" x2=\"259\" y2=\"127\" gradientUnits=\"userSpaceOnUse\">\n<stop offset=\"0\" stop-color=\"#0064E1\"/>\n<stop offset=\"0.4\" stop-color=\"#0064E1\"/>\n<stop offset=\"0.83\" stop-color=\"#0073EE\"/>\n<stop offset=\"1\" stop-color=\"#0082FB\"/>\n</linearGradient>\n<linearGradient id=\"meta-grad-2\" x1=\"45\" y1=\"139\" x2=\"45\" y2=\"66\" gradientUnits=\"userSpaceOnUse\">\n<stop offset=\"0\" stop-color=\"#0082FB\"/>\n<stop offset=\"1\" stop-color=\"#0064E0\"/>\n</linearGradient>\n</defs>\n<g transform=\"translate(0 16.6667) scale(0.3472222)\">\n<path fill=\"#0081FB\" d=\"M31.06 125.96c0 10.98 2.41 19.41 5.56 24.51 4.13 6.68 10.29 9.51 16.57 9.51 8.1 0 15.51-2.01 29.79-21.76 11.44-15.83 24.92-38.05 33.99-51.98l15.36-23.6c10.67-16.39 23.02-34.61 37.18-46.96C181.07 5.6 193.54 0 206.09 0c21.07 0 41.14 12.21 56.5 35.11 16.81 25.08 24.97 56.67 24.97 89.27 0 19.38-3.82 33.62-10.32 44.87-6.28 10.88-18.52 21.75-39.11 21.75v-31.02c17.63 0 22.03-16.2 22.03-34.74 0-26.42-6.16-55.74-19.73-76.69-9.63-14.86-22.11-23.94-35.84-23.94-14.85 0-26.8 11.2-40.23 31.17-7.14 10.61-14.47 23.54-22.7 38.13l-9.06 16.05c-18.2 32.27-22.81 39.62-31.91 51.75C84.74 183.95 71.12 192 53.19 192c-21.27 0-34.72-9.21-43.05-23.09C3.34 157.6 0 142.76 0 125.85z\"/>\n<path fill=\"url(#meta-grad-1)\" d=\"M24.49 37.3C38.73 15.35 59.28 0 82.85 0c13.65 0 27.22 4.04 41.39 15.61 15.5 12.65 32.02 33.48 52.63 67.81l7.39 12.32c17.84 29.72 27.99 45.01 33.93 52.22 7.64 9.26 12.99 12.02 19.94 12.02 17.63 0 22.03-16.2 22.03-34.74l27.4-.86c0 19.38-3.82 33.62-10.32 44.87-6.28 10.88-18.52 21.75-39.11 21.75-12.8 0-24.14-2.78-36.68-14.61-9.64-9.08-20.91-25.21-29.58-39.71l-25.79-43.08c-12.94-21.62-24.81-37.74-31.68-45.04-7.39-7.85-16.89-17.33-32.05-17.33-12.27 0-22.69 8.61-31.41 21.78z\"/>\n<path fill=\"url(#meta-grad-2)\" d=\"M82.35 31.23c-12.27 0-22.69 8.61-31.41 21.78-12.33 18.61-19.88 46.33-19.88 72.95 0 10.98 2.41 19.41 5.56 24.51l-26.48 17.44C3.34 156.6 0 141.76 0 124.85c0-30.75 8.44-62.8 24.49-87.55C38.73 15.35 59.28 0 82.85 0z\"/>\n</g>\n</svg>`;\n\nconst ALIBABA_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\n<rect width=\"48\" height=\"48\" fill=\"#FF5A00\"/>\n<path d=\"M31.5 12c3 .2 6.2.7 8.6 2.7 1.9 1.6 2.7 4.2 2.3 6.6-.4 1.8-1.2 3.4-2.1 5-1.8 3.1-4 6-6.1 8.9-.4.5-.7 1.1-.6 1.7 0 .5.4.9.9 1.1.9.4 1.8.3 2.7.2 2.9-.3 5.6-1.2 8.4-2.1.2-.1.3.1.4.2-2.9 1.9-6 3.6-9.3 4.8-1.8.6-3.7 1.2-5.7 1-1-.1-2-.7-2.4-1.7-.4-1.3-.2-2.8.3-4 .9-1.9 2.2-3.6 3.5-5.3 2.1-2.8 4.3-5.5 6-8.6.6-1.1 1.1-2.4.6-3.6-.5-1.1-1.6-1.8-2.7-2.3-1.9-.8-3.9-1.4-5.9-1.9l.9.6c.7.5 1.4 1.1 2.1 1.6-2.6.5-5.3 1-7.9 1.7-3.9 1-7.8 2.3-11.6 3.7.4.7.7 1.5 1.1 2.2-.9 1-1.7 1.9-2.6 2.9 2.1.6 4.3.7 6.4.2 1.8-.4 3.5-1.3 4.9-2.5-.4-.5-.9-.8-1.4-1.2 1.7 0 3.2 1.5 3.2 3.2l-1 .1c-.1-.4-.2-.7-.3-1.1-1.9 1.7-4.4 2.8-6.9 3.1-2.2.3-4.5-.1-6.7-.8.1 1.3.3 2.6.4 3.9-1.2.5-2.3 1.1-3.3 2-.8.7-1.6 1.5-1.9 2.5-.3.9.2 1.9 1 2.4 1 .6 2.1.9 3.2 1 1.5.2 3 .2 4.4.1 2.9-.2 5.8-.8 8.6-1.5.3-.1.4.4.1.4-2.3 1.2-4.6 2.1-7.1 2.8-2.3.6-4.7.9-7.1 1-2.4-.1-5-.5-7-1.9-1.4-1.2-2.2-3-2.2-4.8v-.1c0-1.9.7-3.8 1.6-5.5 1.2-2.4 2.8-4.6 4.6-6.5 3.1-3.4 7-6.1 11.2-8 4.4-2 9-3.4 13.8-3.7z\" fill=\"white\"/>\n</svg>`;\n\nconst ZAI_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\n<rect width=\"48\" height=\"48\" rx=\"4\" fill=\"#2D2D2D\"/>\n<path d=\"M35 10H13v4h14L13 34v4h22v-4H21l14-20V10z\" fill=\"white\"/>\n</svg>`;\n\nconst OPENAI_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\">\n<rect width=\"48\" height=\"48\" rx=\"24\" fill=\"white\"/>\n<path d=\"M19.3418 18.5599V14.7599C19.3418 14.4399 19.4608 14.1998 19.7382 14.04L27.3102 9.63997C28.3409 9.03999 29.5699 8.76014 30.8383 8.76014C35.5954 8.76014 38.6085 12.4802 38.6085 16.4401C38.6085 16.72 38.6085 17.04 38.5687 17.3601L30.7194 12.72C30.2437 12.4401 29.7678 12.4401 29.2922 12.72L19.3418 18.5599ZM37.0226 33.36V24.2799C37.0226 23.7197 36.7846 23.3197 36.309 23.0398L26.3586 17.1998L29.6093 15.3197C29.8868 15.1599 30.1247 15.1599 30.4022 15.3197L37.9741 19.7197C40.1547 20.9999 41.6213 23.7197 41.6213 26.3596C41.6213 29.3995 39.8375 32.1999 37.0226 33.36ZM17.0029 25.3601L13.7522 23.4402C13.4748 23.2804 13.3557 23.0402 13.3557 22.7202V13.9203C13.3557 9.64039 16.6065 6.40016 21.0069 6.40016C22.6722 6.40016 24.2179 6.96029 25.5265 7.96025L17.7168 12.5204C17.2412 12.8003 17.0033 13.2002 17.0033 13.7605L17.0029 25.3601ZM24 29.44L19.3418 26.8001V21.2003L24 18.5604L28.6578 21.2003V26.8001L24 29.44ZM26.993 41.6002C25.3278 41.6002 23.7821 41.04 22.4735 40.0402L30.2831 35.4799C30.7588 35.2001 30.9967 34.8001 30.9967 34.2399V22.6399L34.2873 24.5598C34.5646 24.7196 34.6837 24.9597 34.6837 25.2798V34.0797C34.6837 38.3596 31.3931 41.6002 26.993 41.6002ZM17.5975 32.6802L10.0255 28.2803C7.84493 27.0001 6.37833 24.2803 6.37833 21.6404C6.37833 18.5604 8.20193 15.8004 11.0164 14.6403V23.7602C11.0164 24.3204 11.2544 24.7204 11.73 25.0003L21.641 30.8001L18.3902 32.6802C18.1129 32.84 17.8749 32.84 17.5975 32.6802ZM17.1617 39.2402C12.682 39.2402 9.39151 35.8402 9.39151 31.6401C9.39151 31.3201 9.43125 31.0001 9.47066 30.68L17.2803 35.2402C17.7559 35.5201 18.2319 35.5201 18.7074 35.2402L28.6578 29.4404V33.2404C28.6578 33.5605 28.5388 33.8005 28.2614 33.9604L20.6894 38.3604C19.6586 38.9603 18.4301 39.2402 17.1617 39.2402ZM26.993 44C31.7899 44 35.7936 40.5601 36.7057 36C41.1457 34.8399 44 30.6399 44 26.36C44 23.5598 42.8108 20.8401 40.6701 18.88C40.8683 18.0399 40.9872 17.1998 40.9872 16.3602C40.9872 10.6403 36.3885 6.35998 31.0763 6.35998C30.0062 6.35998 28.9754 6.51979 27.9446 6.88001C26.1604 5.11992 23.7025 4 21.0069 4C16.2101 4 12.2064 7.4398 11.2943 12C6.8543 13.1601 4 17.3601 4 21.6399C4 24.4401 5.18916 27.1599 7.32995 29.1199C7.13174 29.96 7.01277 30.8001 7.01277 31.6398C7.01277 37.3597 11.6114 41.6399 16.9236 41.6399C17.9938 41.6399 19.0246 41.4801 20.0554 41.1199C21.8392 42.88 24.2971 44 26.993 44Z\" fill=\"black\"/>\n</svg>`;\n\nconst MODEL_ICON_PREFIXES: Array<{ prefix: string; icon: string }> = [\n { prefix: 'llama', icon: META_ICON },\n { prefix: 'gpt', icon: OPENAI_ICON },\n { prefix: 'zai', icon: ZAI_ICON },\n { prefix: 'qwen', icon: ALIBABA_ICON },\n];\n\nexport function svgToDataUri(svg: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nexport function getCerebrasIconDataUri(): string {\n return svgToDataUri(CEREBRAS_ICON);\n}\n\nexport function getCerebrasModelIconDataUri(modelId?: string): string | undefined {\n if (!modelId) return undefined;\n const normalizedModelId = modelId.trim().toLowerCase();\n const icon = MODEL_ICON_PREFIXES.find(({ prefix }) => normalizedModelId.startsWith(prefix))?.icon;\n return icon ? svgToDataUri(icon) : undefined;\n}\n","import { z } from 'zod';\n\n/**\n * Cerebras provider options schema.\n *\n * The provider uses Cerebras' Chat Completions API directly. The schema\n * covers the common documented parameters and remains passthrough for\n * forward compatibility with new API fields.\n */\nexport const cerebrasProviderOptions = z.object({\n /**\n * Clear reasoning from prior turns.\n * Supported on `zai-glm-4.7`.\n */\n clear_thinking: z.boolean().optional(),\n\n /** Return token log probabilities. */\n logprobs: z.boolean().optional(),\n\n /** Number of top logprobs to return when `logprobs` is enabled. */\n top_logprobs: z.number().int().min(0).max(20).optional(),\n\n /** Sampling seed for best-effort determinism. */\n seed: z.number().int().optional(),\n\n /** End-user identifier for abuse monitoring. */\n user: z.string().optional(),\n\n /**\n * Request prioritization.\n * `priority` and some other tiers may require dedicated/private access.\n */\n service_tier: z.enum(['priority', 'default', 'auto', 'flex']).optional(),\n\n /**\n * Override the model's reasoning behavior directly.\n * The provider also maps Standard Agents `reasoning.level` automatically.\n */\n reasoning_effort: z.enum(['none', 'low', 'medium', 'high']).optional(),\n}).passthrough();\n\nexport type CerebrasProviderOptions = z.infer<typeof cerebrasProviderOptions>;\n","import type { ProviderFactoryConfig, ProviderFactoryWithOptions } from '@standardagents/spec';\nimport { CerebrasProvider } from './CerebrasProvider';\nimport { cerebrasProviderOptions } from './providerOptions';\n\n/**\n * Cerebras provider factory for Standard Agents.\n *\n * Uses Cerebras' OpenAI-compatible Chat Completions API with typed\n * providerOptions for Cerebras-specific request parameters.\n */\nexport const cerebras: ProviderFactoryWithOptions<typeof cerebrasProviderOptions> =\n Object.assign(\n (config: ProviderFactoryConfig) => new CerebrasProvider(config),\n { providerOptions: cerebrasProviderOptions }\n );\n\nexport { cerebrasProviderOptions, type CerebrasProviderOptions } from './providerOptions';\nexport { CerebrasProvider } from './CerebrasProvider';\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@standardagents/cerebras",
|
|
3
|
+
"version": "0.0.1-dev.fffff",
|
|
4
|
+
"private": false,
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public",
|
|
7
|
+
"registry": "https://registry.npmjs.org/"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"description": "Cerebras provider for Standard Agents",
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"README.md"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsup",
|
|
25
|
+
"dev": "tsup --watch",
|
|
26
|
+
"typecheck": "tsc --noEmit",
|
|
27
|
+
"test": "cd ../.. && vitest --dir packages/cerebras",
|
|
28
|
+
"test:run": "cd ../.. && vitest run --dir packages/cerebras"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"zod": "4.3.5"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"@standardagents/spec": "^0.10.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@standardagents/spec": "workspace:*",
|
|
38
|
+
"tsup": "^8.3.5",
|
|
39
|
+
"typescript": "^5.9.0"
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"standardagents",
|
|
43
|
+
"cerebras",
|
|
44
|
+
"provider",
|
|
45
|
+
"ai",
|
|
46
|
+
"llm"
|
|
47
|
+
],
|
|
48
|
+
"author": "FormKit Inc.",
|
|
49
|
+
"license": "UNLICENSED"
|
|
50
|
+
}
|