SDK quickstart: Node.js

The official OpenAI Node SDK + the Vercel AI SDK both work pointed at our endpoint. TypeScript-friendly out of the box.

Install

npm install openai
# or, for the Vercel AI SDK convenience layer:
npm install ai @ai-sdk/openai

Hello world (openai)

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.greenjoules.cloud/v1",
  apiKey: process.env.JC_API_KEY,
});

const r = await client.chat.completions.create({
  model: "auto",
  messages: [{ role: "user", content: "hi" }],
});
console.log(r.choices[0].message.content);

Hello world (Vercel AI SDK)

import { createOpenAI } from "@ai-sdk/openai";
import { generateText } from "ai";

const jc = createOpenAI({
  baseURL: "https://api.greenjoules.cloud/v1",
  apiKey: process.env.JC_API_KEY,
});

const { text } = await generateText({
  model: jc("auto"),
  prompt: "hi",
});
console.log(text);

Joule headers

The OpenAI Node SDK exposes raw response headers via .withResponse():

const { data, response } = await client.chat.completions
  .with_raw_response
  .create({ model: "auto", messages: [...] });

console.log(data.choices[0].message.content);
console.log("joules:", response.headers.get("x-energy-joules"));
console.log("routed:", response.headers.get("x-routed-to"));

The Vercel AI SDK surfaces them under providerMetadata:

const result = await streamText({ model: jc("auto"), prompt: "..." });
const meta = result.providerMetadata;
const joules = meta?.openai?.headers?.["x-energy-joules"];

Streaming

const stream = await client.chat.completions.create({
  model: "auto",
  stream: true,
  messages: [{ role: "user", content: "tell me a story" }],
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0].delta.content ?? "");
}

Embeddings + tool use

// embeddings
const r = await client.embeddings.create({
  model: "text-embedding-3-small",
  input: ["the quick brown fox", "lorem ipsum"],
});

// tool use
const tools = [{
  type: "function",
  function: {
    name: "get_weather",
    description: "Get current weather in a location",
    parameters: { type: "object", properties: { location: { type: "string" } } },
  },
}];

const r2 = await client.chat.completions.create({
  model: "auto",
  tools,
  messages: [{ role: "user", content: "weather in Helsinki?" }],
});

Errors

import OpenAI from "openai";

try {
  await client.chat.completions.create({...});
} catch (e) {
  if (e instanceof OpenAI.APIError && e.status === 402) {
    // top up balance
  } else if (e instanceof OpenAI.APIError && e.status === 429) {
    // energy budget hit
  } else throw e;
}

Next

For full app patterns, see Build a chatbot or Build a RAG app.