62 lines
2.1 KiB
TypeScript
62 lines
2.1 KiB
TypeScript
import { describe, expect } from "bun:test"
|
|
import { Effect } from "effect"
|
|
import { Image, ImageInput } from "../../src"
|
|
import { OpenAI } from "../../src/providers"
|
|
import { dimensions } from "../lib/image"
|
|
import { recordedTests } from "../recorded-test"
|
|
|
|
const model = OpenAI.configure({
|
|
apiKey: process.env.OPENAI_API_KEY ?? "fixture",
|
|
}).image("gpt-image-1-mini")
|
|
|
|
const recorded = recordedTests({
|
|
prefix: "openai-images",
|
|
provider: "openai",
|
|
protocol: "openai-images",
|
|
requires: ["OPENAI_API_KEY"],
|
|
})
|
|
|
|
describe("OpenAI Images recorded", () => {
|
|
recorded.effect("generates an image", () =>
|
|
Effect.gen(function* () {
|
|
const response = yield* Image.generate({
|
|
model,
|
|
prompt: "A simple flat black circle centered on a plain white background.",
|
|
options: { quality: "low", outputFormat: "jpeg", outputCompression: 10, size: "1024x1024" },
|
|
})
|
|
|
|
expect(response.images).toHaveLength(1)
|
|
expect(response.image?.mediaType).toBe("image/jpeg")
|
|
expect(response.image?.data).toBeInstanceOf(Uint8Array)
|
|
expect(response.image?.data.length).toBeGreaterThan(0)
|
|
}),
|
|
)
|
|
|
|
recorded.effect.with(
|
|
"edits an image",
|
|
{
|
|
options: {
|
|
match: (incoming, recorded) => incoming.method === recorded.method && incoming.url === recorded.url,
|
|
},
|
|
},
|
|
() =>
|
|
Effect.gen(function* () {
|
|
const response = yield* Image.generate({
|
|
model,
|
|
prompt: "Keep the simple shape and change it from black to bright green.",
|
|
images: [
|
|
ImageInput.bytes(
|
|
yield* Effect.promise(() => Bun.file("test/fixtures/images/edit-source.jpg").bytes()),
|
|
"image/jpeg",
|
|
),
|
|
],
|
|
options: { quality: "low", outputFormat: "jpeg", outputCompression: 10, size: "1024x1024" },
|
|
})
|
|
|
|
expect(response.image?.mediaType).toBe("image/jpeg")
|
|
expect(response.image?.data).toBeInstanceOf(Uint8Array)
|
|
if (!(response.image?.data instanceof Uint8Array)) throw new Error("Expected owned OpenAI image bytes")
|
|
expect(dimensions(response.image.data)).toEqual({ width: 1024, height: 1024 })
|
|
}),
|
|
)
|
|
})
|