Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Generate images via OpenAI, Google, OpenRouter, DashScope, Jimeng, Seedream, and Replicate APIs with batch support.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
scripts/providers/openai.test.ts
1import assert from "node:assert/strict";2import test from "node:test";34import type { CliArgs } from "../types.ts";5import {6buildOpenAIGenerationsBody,7extractImageFromResponse,8getDefaultModel,9getOpenAIAspectRatio,10getOpenAIImageApiDialect,11getOpenAIResolution,12getMimeType,13getOpenAISize,14getOrientationFromAspectRatio,15inferAspectRatioFromSize,16inferResolutionFromSize,17parseAspectRatio,18validateArgs,19} from "./openai.ts";2021function makeArgs(overrides: Partial<CliArgs> = {}): CliArgs {22return {23prompt: null,24promptFiles: [],25imagePath: null,26provider: null,27model: null,28aspectRatio: null,29size: null,30quality: "2k",31imageSize: null,32imageApiDialect: null,33referenceImages: [],34n: 1,35batchFile: null,36jobs: null,37json: false,38help: false,39...overrides,40};41}4243test("OpenAI aspect-ratio parsing and size selection match model families", () => {44assert.equal(getDefaultModel(), "gpt-image-2");45assert.deepEqual(parseAspectRatio("16:9"), { width: 16, height: 9 });46assert.equal(parseAspectRatio("wide"), null);47assert.equal(parseAspectRatio("0:1"), null);4849assert.equal(getOpenAISize("dall-e-3", "16:9", "2k"), "1792x1024");50assert.equal(getOpenAISize("dall-e-3", "9:16", "normal"), "1024x1792");51assert.equal(getOpenAISize("dall-e-2", "16:9", "2k"), "1024x1024");52assert.equal(getOpenAISize("gpt-image-1.5", "16:9", "2k"), "1536x1024");53assert.equal(getOpenAISize("gpt-image-1.5", "4:3", "2k"), "1024x1024");54assert.equal(getOpenAISize("gpt-image-2", "16:9", "2k"), "2048x1152");55assert.equal(getOpenAISize("gpt-image-2", "9:16", "2k"), "1152x2048");56assert.equal(getOpenAISize("gpt-image-2", "4:3", "2k"), "2048x1536");57assert.equal(getOpenAISize("gpt-image-2", "2.35:1", "normal"), "1248x528");58assert.equal(inferAspectRatioFromSize("1536x1024"), "3:2");59assert.equal(inferResolutionFromSize("1536x1024"), "2K");60assert.equal(getOpenAIAspectRatio({ aspectRatio: null, size: "2048x1152" }), "16:9");61assert.equal(getOpenAIResolution({ imageSize: null, size: "2048x1152", quality: "normal" }), "2K");62assert.equal(getOrientationFromAspectRatio("16:9"), "landscape");63assert.equal(getOrientationFromAspectRatio("9:16"), "portrait");64assert.equal(getOrientationFromAspectRatio("1:1"), null);65assert.equal(getOpenAIImageApiDialect({ imageApiDialect: null }), "openai-native");66});6768test("OpenAI generations body switches between native and ratio-metadata dialects", () => {69assert.deepEqual(70buildOpenAIGenerationsBody("Draw a skyline", "gpt-image-2", {71aspectRatio: "16:9",72size: null,73quality: "2k",74imageSize: null,75imageApiDialect: null,76}),77{78model: "gpt-image-2",79prompt: "Draw a skyline",80size: "2048x1152",81quality: "high",82},83);8485assert.deepEqual(86buildOpenAIGenerationsBody("Draw a skyline", "gemini-3-pro-image-preview", {87aspectRatio: "16:9",88size: null,89quality: "2k",90imageSize: null,91imageApiDialect: "ratio-metadata",92}),93{94model: "gemini-3-pro-image-preview",95prompt: "Draw a skyline",96size: "16:9",97metadata: {98resolution: "2K",99orientation: "landscape",100},101},102);103104assert.deepEqual(105buildOpenAIGenerationsBody("Draw a portrait", "gemini-3-pro-image-preview", {106aspectRatio: null,107size: "1152x2048",108quality: "normal",109imageSize: null,110imageApiDialect: "ratio-metadata",111}),112{113model: "gemini-3-pro-image-preview",114prompt: "Draw a portrait",115size: "9:16",116metadata: {117resolution: "2K",118orientation: "portrait",119},120},121);122});123124test("OpenAI validates gpt-image-2 custom size constraints", () => {125assert.doesNotThrow(() =>126validateArgs("gpt-image-2", makeArgs({ size: "3840x2160" })),127);128assert.doesNotThrow(() =>129validateArgs("gpt-image-2-2026-04-21", makeArgs({ aspectRatio: "2.35:1" })),130);131132assert.throws(133() => validateArgs("gpt-image-2", makeArgs({ size: "1024x576" })),134/total pixels/,135);136assert.throws(137() => validateArgs("gpt-image-2", makeArgs({ size: "1025x1024" })),138/multiples of 16px/,139);140assert.throws(141() => validateArgs("gpt-image-2", makeArgs({ aspectRatio: "4:1" })),142/must not exceed 3:1/,143);144});145146test("OpenAI mime-type detection covers supported reference image extensions", () => {147assert.equal(getMimeType("frame.png"), "image/png");148assert.equal(getMimeType("frame.jpg"), "image/jpeg");149assert.equal(getMimeType("frame.webp"), "image/webp");150assert.equal(getMimeType("frame.gif"), "image/gif");151});152153test("OpenAI response extraction supports base64 and URL download flows", async (t) => {154const originalFetch = globalThis.fetch;155t.after(() => {156globalThis.fetch = originalFetch;157});158159const fromBase64 = await extractImageFromResponse({160data: [{ b64_json: Buffer.from("hello").toString("base64") }],161});162assert.equal(Buffer.from(fromBase64).toString("utf8"), "hello");163164globalThis.fetch = async () =>165new Response(Uint8Array.from([1, 2, 3]), {166status: 200,167headers: { "Content-Type": "application/octet-stream" },168});169170const fromUrl = await extractImageFromResponse({171data: [{ url: "https://example.com/image.png" }],172});173assert.deepEqual([...fromUrl], [1, 2, 3]);174175await assert.rejects(176() => extractImageFromResponse({ data: [{}] }),177/No image in response/,178);179});180