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

Installbun add @cleverrouter/sdk@alpha openai
Helpercr.openai() — pre-configured OpenAI client
baseURLhttps://api.cleverouter.eu/v1

Via createCleverRouter

The CleverRouter factory returns an OpenAI client wired to the gateway, complete with defaultHeaders for strategy/provider hints:

client.ts
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:

plain-openai.ts
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 CRError subclasses (you get OpenAI's APIError instead).
  • 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).