From 9236302991305b3bed0901009443ede55ab0b0b1 Mon Sep 17 00:00:00 2001 From: nitayr Date: Sun, 22 Feb 2026 13:02:44 +0100 Subject: [PATCH] support cerberas --- README.md | 19 ++++++++++++++++++- examples/node-modules-viz/README.md | 3 +++ examples/node-modules-viz/server.mjs | 1 + src/llm-client.test.ts | 21 +++++++++++++++++++-- src/llm-client.ts | 4 ++++ src/rlm.ts | 2 +- src/types.ts | 2 +- 7 files changed, 47 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b1e8fee..930254b 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,7 @@ Create an RLLM instance with sensible defaults. ```typescript const rlm = createRLLM({ model: 'gpt-4o-mini', // Model name - provider: 'openai', // 'openai' | 'anthropic' | 'gemini' | 'openrouter' | 'custom' + provider: 'openai', // 'openai' | 'anthropic' | 'gemini' | 'openrouter' | 'cerebras' | 'custom' apiKey: process.env.KEY, // Optional, uses env vars by default baseUrl: undefined, // Optional, required for 'custom' provider verbose: true, // Enable logging @@ -131,6 +131,23 @@ const rlm = createRLLM({ **Note:** When using `provider: 'custom'`, the `baseUrl` parameter is **required**. An error will be thrown if it's not provided. +### Cerebras Provider + +Use Cerebras with the built-in `cerebras` provider: + +```typescript +const rlm = createRLLM({ + provider: 'cerebras', + model: 'gpt-oss-120b', + // optional if CEREBRAS_API_KEY is set + apiKey: process.env.CEREBRAS_API_KEY, +}); +``` + +Defaults: +- API key env var: `CEREBRAS_API_KEY` +- Base URL: `https://api.cerebras.ai/v1` + ### `RLLM` Methods | Method | Description | diff --git a/examples/node-modules-viz/README.md b/examples/node-modules-viz/README.md index 69db8d9..a78959a 100644 --- a/examples/node-modules-viz/README.md +++ b/examples/node-modules-viz/README.md @@ -211,6 +211,9 @@ Create a `.env` file: ```bash OPENAI_API_KEY=your_key_here MODEL=gpt-4o-mini # or gpt-4o, gpt-4-turbo, etc. +# Optional: switch provider (openai | anthropic | gemini | openrouter | cerebras) +# PROVIDER=cerebras +# CEREBRAS_API_KEY=your_key_here ``` ## Tips diff --git a/examples/node-modules-viz/server.mjs b/examples/node-modules-viz/server.mjs index ecf7d74..aae1710 100644 --- a/examples/node-modules-viz/server.mjs +++ b/examples/node-modules-viz/server.mjs @@ -49,6 +49,7 @@ const apiKeyName = { openai: 'OPENAI_API_KEY', anthropic: 'ANTHROPIC_API_KEY', openrouter: 'OPENROUTER_API_KEY', + cerebras: 'CEREBRAS_API_KEY', }[provider] || 'API key'; const hasApiKey = provider === 'gemini' diff --git a/src/llm-client.test.ts b/src/llm-client.test.ts index 3bef97d..21cafce 100644 --- a/src/llm-client.test.ts +++ b/src/llm-client.test.ts @@ -11,7 +11,7 @@ import { LLMClient } from "./llm-client.js"; // Test the provider configuration logic directly // (extracted from LLMClient to make it testable) -function getDefaultApiKey(provider: "openai" | "anthropic" | "openrouter" | "custom"): string | undefined { +function getDefaultApiKey(provider: "openai" | "anthropic" | "openrouter" | "cerebras" | "custom"): string | undefined { switch (provider) { case "openai": return process.env["OPENAI_API_KEY"]; @@ -19,12 +19,14 @@ function getDefaultApiKey(provider: "openai" | "anthropic" | "openrouter" | "cus return process.env["ANTHROPIC_API_KEY"]; case "openrouter": return process.env["OPENROUTER_API_KEY"]; + case "cerebras": + return process.env["CEREBRAS_API_KEY"]; case "custom": return undefined; } } -function getDefaultBaseUrl(provider: "openai" | "anthropic" | "openrouter" | "custom"): string | undefined { +function getDefaultBaseUrl(provider: "openai" | "anthropic" | "openrouter" | "cerebras" | "custom"): string | undefined { switch (provider) { case "openai": return undefined; // Uses default @@ -32,6 +34,8 @@ function getDefaultBaseUrl(provider: "openai" | "anthropic" | "openrouter" | "cu return "https://api.anthropic.com/v1"; case "openrouter": return "https://openrouter.ai/api/v1"; + case "cerebras": + return "https://api.cerebras.ai/v1"; case "custom": return undefined; } @@ -50,6 +54,10 @@ describe("LLMClient provider configuration", () => { it("returns OpenRouter base URL", () => { expect(getDefaultBaseUrl("openrouter")).toBe("https://openrouter.ai/api/v1"); }); + + it("returns Cerebras base URL", () => { + expect(getDefaultBaseUrl("cerebras")).toBe("https://api.cerebras.ai/v1"); + }); }); describe("getDefaultApiKey", () => { @@ -80,6 +88,15 @@ describe("LLMClient provider configuration", () => { process.env["OPENROUTER_API_KEY"] = original; }); + it("reads CEREBRAS_API_KEY for cerebras provider", () => { + const original = process.env["CEREBRAS_API_KEY"]; + process.env["CEREBRAS_API_KEY"] = "test-cerebras-key"; + + expect(getDefaultApiKey("cerebras")).toBe("test-cerebras-key"); + + process.env["CEREBRAS_API_KEY"] = original; + }); + it("returns undefined for custom provider (must be provided explicitly)", () => { expect(getDefaultApiKey("custom")).toBeUndefined(); }); diff --git a/src/llm-client.ts b/src/llm-client.ts index f5b0d05..bb91e18 100644 --- a/src/llm-client.ts +++ b/src/llm-client.ts @@ -63,6 +63,8 @@ export class LLMClient { return process.env["GEMINI_API_KEY"] ?? process.env["GOOGLE_API_KEY"]; case "openrouter": return process.env["OPENROUTER_API_KEY"]; + case "cerebras": + return process.env["CEREBRAS_API_KEY"]; case "custom": return undefined; // Must be provided explicitly } @@ -78,6 +80,8 @@ export class LLMClient { return "https://generativelanguage.googleapis.com/v1beta/openai/"; case "openrouter": return "https://openrouter.ai/api/v1"; + case "cerebras": + return "https://api.cerebras.ai/v1"; case "custom": return undefined; // Must be provided explicitly (validated in constructor) } diff --git a/src/rlm.ts b/src/rlm.ts index bcf5d41..a7b518b 100644 --- a/src/rlm.ts +++ b/src/rlm.ts @@ -334,7 +334,7 @@ export class RLLM { */ export function createRLLM(options: { model?: string; - provider?: "openai" | "anthropic" | "gemini" | "openrouter" | "custom"; + provider?: "openai" | "anthropic" | "gemini" | "openrouter" | "cerebras" | "custom"; apiKey?: string; baseUrl?: string; verbose?: boolean; diff --git a/src/types.ts b/src/types.ts index d6f781d..442f21a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -23,7 +23,7 @@ export type InferContextType = S extends ZodType ? T : string; // LLM Client Types // ============================================================================ -export type LLMProvider = "openai" | "anthropic" | "gemini" | "openrouter" | "custom"; +export type LLMProvider = "openai" | "anthropic" | "gemini" | "openrouter" | "cerebras" | "custom"; export interface ChatMessage { role: "system" | "user" | "assistant" | "tool";