image generation
generate images from text prompts
basic usage
import { generateImage } from "@threaded/ai";
const result = await generateImage(
"openai/dall-e-3",
"a cat wearing a tiny top hat"
);
const buffer = Buffer.from(result.data, "base64");
writeFileSync("output.png", buffer);
returns { data: string, revisedPrompt?: string }
data- base64-encoded image data (or url if requested)revisedPrompt- the prompt actually used by the model (some providers revise your prompt)
supported providers
openai
dall-e and gpt-image models
await generateImage("openai/dall-e-3", "a sunset over mountains");
await generateImage("openai/dall-e-2", "a sunset over mountains");
await generateImage("openai/gpt-image-1.5", "a sunset over mountains");
xai (grok)
returns jpeg format
google (gemini)
await generateImage("google/gemini-2.5-flash-image", "a sunset over mountains");
await generateImage("google/nano-banana-pro-preview", "a sunset over mountains");
configuration options
pass options as the third argument
await generateImage("openai/dall-e-3", "prompt", {
size: "1024x1024",
quality: "hd",
style: "vivid",
});
common options
| option | type | description |
|---|---|---|
n |
number | number of images to generate (1-10) |
size |
string | image dimensions |
quality |
string | generation quality |
responseFormat |
string | "url" or "b64_json" |
dall-e options
| option | values |
|---|---|
size |
"256x256", "512x512", "1024x1024" (dall-e-2) |
"1024x1024", "1792x1024", "1024x1792" (dall-e-3) |
|
quality |
"standard", "hd" |
style |
"vivid", "natural" |
gpt-image options
gpt-image-1, gpt-image-1.5, gpt-image-1-mini
| option | values |
|---|---|
size |
"1024x1024", "1536x1024", "1024x1536", "auto" |
quality |
"low", "medium", "high", "auto" |
outputFormat |
"png", "jpeg", "webp" |
outputCompression |
0-100 (jpeg/webp only) |
background |
"transparent", "opaque", "auto" |
await generateImage("openai/gpt-image-1.5", "a golden crown", {
size: "1536x1024",
quality: "high",
outputFormat: "webp",
background: "transparent",
});
transparent backgrounds require png or webp format
google options
| option | values |
|---|---|
aspectRatio |
"1:1", "16:9", "9:16", "4:3", "3:4" |
revised prompts
some providers (openai, xai) revise your prompt before generating
const result = await generateImage(
"xai/grok-2-image-1212",
"a cat in a hat"
);
console.log(result.revisedPrompt);
// "A high-resolution photograph of a gray and white cat
// wearing a small black top hat, sitting in a plush,
// red velvet vintage armchair..."
useful for understanding what the model actually generated
saving images
as file
import { writeFileSync } from "fs";
const result = await generateImage("openai/gpt-image-1.5", "prompt");
const buffer = Buffer.from(result.data, "base64");
writeFileSync("output.png", buffer);
compressed jpeg
const result = await generateImage("openai/gpt-image-1.5", "prompt", {
outputFormat: "jpeg",
outputCompression: 80,
});
const buffer = Buffer.from(result.data, "base64");
writeFileSync("output.jpg", buffer);
smaller file size, faster generation
api keys
environment variables are detected automatically
| provider | env var |
|---|---|
| openai | OPENAI_API_KEY |
| xai | XAI_API_KEY |
GEMINI_API_KEY |
or use setKeys() - see quick start
complete example
import { generateImage } from "@threaded/ai";
import { writeFileSync } from "fs";
const providers = [
{ model: "openai/gpt-image-1.5", ext: "png" },
{ model: "xai/grok-2-image-1212", ext: "jpg" },
{ model: "google/nano-banana-pro-preview", ext: "png" },
];
const prompt = "a robot playing chess with a penguin";
for (const { model, ext } of providers) {
const result = await generateImage(model, prompt);
const buffer = Buffer.from(result.data, "base64");
const filename = model.replace("/", "-") + "." + ext;
writeFileSync(filename, buffer);
console.log(`${model}: saved to ${filename}`);
if (result.revisedPrompt) {
console.log(` revised: ${result.revisedPrompt.slice(0, 100)}...`);
}
}
generates same prompt across multiple providers for comparison
next: tool approval