SDKs

TypeScript

OpenAI-compatible client against Meridian. Base URL https://meridian.getnimbus.net/api/v1.

npm i openai

Auto 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-120b

Embeddings:

azure/text-embedding-3-smallazure/text-embedding-3-large