OpenAI SDK
Drop-in `baseURL` swap. Works with the official OpenAI SDK, LangChain, LlamaIndex.
If your code already uses the OpenAI SDK (any language), CleverRouter
is a baseURL change. The wire format is identical.
At a glance
| Install | bun add @cleverrouter/sdk@alpha openai |
| Helper | cr.openai() — pre-configured OpenAI client |
baseURL | https://api.cleverouter.eu/v1 |
Via createCleverRouter
The CleverRouter factory returns an OpenAI client wired to the
gateway, complete with defaultHeaders for strategy/provider hints:
import { createCleverRouter } from '@cleverrouter/sdk';
export const cr = createCleverRouter({
apiKey: process.env.CLEVERROUTER_API_KEY!,
// optional defaults — applied to every call from this instance:
provider: 'scaleway',
strategy: 'fastest',
});
const res = await cr.openai().chat.completions.create({
model: 'mistral/mistral-small-3.2',
messages: [{ role: 'user', content: 'Bonjour from Paris.' }],
});Without the CleverRouter SDK
You don't need @cleverrouter/sdk at all — the OpenAI SDK alone
works:
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: process.env.CLEVERROUTER_API_KEY!,
baseURL: 'https://api.cleverouter.eu/v1',
});
const res = await client.chat.completions.create({
model: 'mistral/mistral-small-3.2',
messages: [{ role: 'user', content: 'Hi.' }],
});What you give up by skipping @cleverrouter/sdk:
- Typed
CRErrorsubclasses (you get OpenAI'sAPIErrorinstead). - Reconnect-on-drop streaming with
Last-Event-ID. - The direct helpers (
cr.embed,cr.rerank,cr.transcribe). - The capability-class helpers (
cr.pickByClass('coder')).
LangChain, LlamaIndex, Vercel openai
Same recipe — set base_url / openai_api_base / baseURL to
https://api.cleverouter.eu/v1 and use a cr_live_* key:
import { ChatOpenAI } from '@langchain/openai';
const model = new ChatOpenAI({
apiKey: process.env.CLEVERROUTER_API_KEY,
configuration: { baseURL: 'https://api.cleverouter.eu/v1' },
model: 'mistral/mistral-small-3.2',
});from langchain_openai import ChatOpenAI
model = ChatOpenAI(
api_key=os.environ["CLEVERROUTER_API_KEY"],
base_url="https://api.cleverouter.eu/v1",
model="mistral/mistral-small-3.2",
)from llama_index.llms.openai_like import OpenAILike
llm = OpenAILike(
api_key=os.environ["CLEVERROUTER_API_KEY"],
api_base="https://api.cleverouter.eu/v1",
model="mistral/mistral-small-3.2",
is_chat_model=True,
)Passing CleverRouter headers via cr.openai()
Per-call header overrides:
await cr
.openai({
defaultHeaders: cr.headers({ provider: 'tensorix', strategy: 'fastest' }),
})
.chat.completions.create({
model: 'meta/llama-3.3-70b',
messages: [/* ... */],
});cr.headers({ ... }) returns the header object the SDK normally
builds for you — handy when the only client you have is the OpenAI
SDK and you want a per-call route hint.
Errors with `cr.openai()`
When you call through cr.openai(), errors come from the OpenAI
SDK's own subclasses (APIError, RateLimitError,
AuthenticationError). The typed CR* errors apply only to the
direct helpers (cr.chat, cr.stream, cr.embed, cr.rerank,
cr.transcribe, cr.listModels).
Related
- SDK overview — pick the right entry.
- Migrate from OpenAI — full two-line diff.
- Vercel AI SDK — alternative TS entry.