SDKs
TypeScript
OpenAI-compatible client against Meridian. Base URL https://meridian.getnimbus.net/api/v1.
npm i openaiAuto router (recommended)
Pass model: "auto" and Meridian picks the best model per request. Read the router docs for tags + priorities.
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.MERIDIAN_API_KEY!,
baseURL: "https://meridian.getnimbus.net/api/v1",
});
// Let Meridian pick the best model per request.
// See /docs/router for tags + priorities.
const r = await client.chat.completions.create({
model: "auto",
messages: [
{ role: "system", content: "You are a senior engineer." },
{ role: "user", content: "Refactor this TypeScript function for clarity ..." },
],
});
console.log(r.choices[0].message.content);Basic chat
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.MERIDIAN_API_KEY!,
baseURL: "https://meridian.getnimbus.net/api/v1",
});
const r = await client.chat.completions.create({
model: "azure/gpt-5-mini",
messages: [{ role: "user", content: "Hello" }],
});
console.log(r.choices[0].message.content);Streaming
import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.MERIDIAN_API_KEY!, baseURL: "https://meridian.getnimbus.net/api/v1" });
const stream = await client.chat.completions.create({
model: "azure/gpt-5-mini",
messages: [{ role: "user", content: "Stream a haiku about code." }],
stream: true,
});
for await (const part of stream) {
const delta = part.choices?.[0]?.delta?.content;
if (delta) process.stdout.write(delta);
}Embeddings
import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.MERIDIAN_API_KEY!, baseURL: "https://meridian.getnimbus.net/api/v1" });
const res = await client.embeddings.create({
model: "azure/text-embedding-3-large",
input: ["Hello world", "Goodbye world"],
});
console.log(res.data[0].embedding.length);Audio · Speech to text
import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.MERIDIAN_API_KEY!, baseURL: "https://meridian.getnimbus.net/api/v1" });
const fs = await import("node:fs");
const resp = await client.audio.transcriptions.create({ model: "whisper-1", file: fs.createReadStream("speech.mp3") as any });
console.log(resp.text);Audio · Text to speech
import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.MERIDIAN_API_KEY!, baseURL: "https://meridian.getnimbus.net/api/v1" });
const audio = await client.audio.speech.create({ model: "tts-1", voice: "alloy", input: "Hello from Meridian" });
// Save to file
const fs = await import("node:fs/promises");
await fs.writeFile("out.mp3", Buffer.from(await audio.arrayBuffer()));Responses API
import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.MERIDIAN_API_KEY!, baseURL: "https://meridian.getnimbus.net/api/v1" });
const r = await client.responses.create({
model: "azure/gpt-5-mini",
input: [
{ role: "system", content: "You are concise." },
{ role: "user", content: "Write a tagline for a developer SaaS." },
],
modalities: ["text"],
});
console.log(r.output_text);Rerank
// Cohere-compatible rerank via Meridian
const resp = await fetch("https://meridian.getnimbus.net/api/v1/rerank", {
method: "POST",
headers: { "Authorization": `Bearer ${process.env.MERIDIAN_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
model: "nimbus/rerank-1",
query: "best snack for hiking",
documents: [
"Trail mix with nuts and dried fruit",
"Chocolate cake recipe",
"Electrolyte drink comparison",
],
top_n: 2,
}),
});
console.log(await resp.json());Files
Upload, fetch, delete. GET/DELETE require an id query parameter.
// Upload a file (multipart)
const form = new FormData();
form.append("file", new Blob([await (await fetch("https://example.com/favicon.ico")).arrayBuffer()]), "favicon.ico");
form.append("purpose", "assistants");
const up = await fetch("https://meridian.getnimbus.net/api/v1/files", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.MERIDIAN_API_KEY}` },
body: form,
});
console.log(await up.json());// Download a file by id
const id = "<file_id_or_url>";
const res = await fetch(`https://meridian.getnimbus.net/api/v1/files?id=${encodeURIComponent(id)}`, { headers: { Authorization: `Bearer ${process.env.MERIDIAN_API_KEY}` } });
const buf = Buffer.from(await res.arrayBuffer());
await (await import("node:fs/promises")).writeFile("download.bin", buf);// Delete a file by id
const id = "<file_id_or_url>";
const del = await fetch(`https://meridian.getnimbus.net/api/v1/files?id=${encodeURIComponent(id)}`, { method: "DELETE", headers: { Authorization: `Bearer ${process.env.MERIDIAN_API_KEY}` } });
console.log(await del.json());Images
See the Images guide for full options. Basic example:
import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.MERIDIAN_API_KEY!, baseURL: "https://meridian.getnimbus.net/api/v1" });
const img = await client.images.generate({ model: "azure/gpt-image-1", prompt: "Violet and emerald near-black landing page hero, minimalist", size: "1024x1024", n: 1 });
const b64 = img.data[0].b64_json!;
await (await import("node:fs/promises")).writeFile("image.png", Buffer.from(b64, "base64"));Track spend per request
Every response includes the Meridian-priced cost. Read it from the response body or from the X-Meridian-* headers.
import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.MERIDIAN_API_KEY!, baseURL: "https://meridian.getnimbus.net/api/v1" });
// (1) Inline body fields. Meridian extends the OpenAI usage block additively.
const r = await client.chat.completions.create({
model: "azure/gpt-5-mini",
messages: [{ role: "user", content: "Hello" }],
});
const u = r.usage as any;
console.log("user_tokens spent :", u.user_tokens);
console.log("balance after request :", u.balance_after_user_tokens);
console.log("provider tokens :", u.prompt_tokens, u.completion_tokens);
// (2) Custom response headers via raw response.
const raw = await client.chat.completions.with_raw_response.create({
model: "azure/gpt-5-mini",
messages: [{ role: "user", content: "Hello" }],
});
console.log("X-Meridian-Tokens-Used :", raw.response.headers.get("x-meridian-tokens-used"));
console.log("X-Meridian-Balance-After :", raw.response.headers.get("x-meridian-balance-after"));Errors and retries
import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.MERIDIAN_API_KEY!, baseURL: "https://meridian.getnimbus.net/api/v1" });
async function callWithRetry() {
let backoff = 500;
for (let i = 0; i < 6; i++) {
try {
return await client.chat.completions.create({
model: "azure/gpt-5-mini",
messages: [{ role: "user", content: "Hello" }],
});
} catch (e: any) {
const msg = String(e?.message || e);
if (msg.includes("429") || msg.includes("503")) {
await new Promise(r => setTimeout(r, backoff));
backoff = Math.min(8000, backoff * 2);
continue;
}
if (msg.includes("401")) throw new Error("Check MERIDIAN_API_KEY and balance");
throw e;
}
}
}
const resp = await callWithRetry();
console.log(resp.choices[0].message.content);Supported models
Pass any of these as model. Live source of truth: GET /api/v1/models.
Chat / completion:
azure/gpt-5.1azure/gpt-5-codexazure/gpt-4.1azure/gpt-5-miniazure/DeepSeek-V4-Proazure/DeepSeek-V4-Flashazure/grok-4-20-reasoningazure/Llama-4-Maverickazure/Mistral-Large-3azure/Cohere-command-aazure/Kimi-K2-6gpt-oss-120bEmbeddings:
azure/text-embedding-3-smallazure/text-embedding-3-large