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.