Node.js SDK

View as Markdown

Node.js SDK

The MeshAPI Node.js SDK provides a robust, native-fetch TypeScript client. It includes strict-mode typings, AsyncIterable streaming support, and comprehensive error handling.

Requirements

  • Node.js ≥ 18
  • Zero runtime dependencies

Installation

$npm install meshapi-node-sdk

Quick Start

Initialize MeshAPI providing your Base URL and Data-Plane token.

Standard Chat Completion

1import { MeshAPI } from "meshapi-node-sdk";
2
3const client = new MeshAPI({
4 baseUrl: "https://api.meshapi.ai",
5 token: "rsk_...",
6});
7
8const response = await client.chat.completions.create({
9 model: "openai/gpt-4o-mini",
10 messages: [
11 { role: "system", content: "You are a helpful assistant." },
12 { role: "user", content: "What is the capital of France?" },
13 ],
14 temperature: 0.7,
15});
16
17console.log(response.choices[0]?.message.content);

Streaming Chat Completion

Streaming utilizes native JavaScript async iterators (for await).

1const stream = client.chat.completions.create({
2 model: "openai/gpt-4o-mini",
3 messages: [{ role: "user", content: "Write a short poem." }],
4 stream: true,
5});
6
7for await (const chunk of stream) {
8 const delta = chunk.choices[0]?.delta.content ?? "";
9 process.stdout.write(delta);
10}

Error Handling

All API errors throw a MeshAPIApiError with structured fields for deterministic failure handling. Mid-stream errors (e.g., interrupted stream before [DONE]) are also reliably caught and bubbled up as MeshAPIApiErrors.

1import { MeshAPIApiError } from "meshapi-node-sdk";
2
3try {
4 const response = await client.chat.completions.create({ /* ... */ });
5} catch (err) {
6 if (err instanceof MeshAPIApiError) {
7 console.error(`Status [${err.status}] - ${err.errorCode}: ${err.message}`);
8
9 if (err.errorCode === "rate_limit_exceeded") {
10 console.log(`Retry after ${err.retryAfterSeconds}s`);
11 } else if (err.errorCode === "spend_limit_exceeded") {
12 console.log("Spend limit exceeded.");
13 }
14 }
15}

Prompt Templates

You can pass a Template ID instead of messages directly to utilize saved prompt templates.

1const response = await client.chat.completions.create({
2 messages: [{ role: "user", content: "How do I reset my password?" }],
3 template: "support-agent",
4 variables: { company: "Acme Corp" },
5});