66 lines
2.3 KiB
TypeScript
66 lines
2.3 KiB
TypeScript
import { describe, expect } from "bun:test"
|
|
import { Effect } from "effect"
|
|
import { LLM, LLMEvent, Message } from "../../src"
|
|
import { OpenAI } from "../../src/providers"
|
|
import { recordedTests } from "../recorded-test"
|
|
|
|
const openai = OpenAI.configure({
|
|
apiKey: process.env.OPENAI_API_KEY ?? "fixture",
|
|
})
|
|
|
|
const recorded = recordedTests({
|
|
prefix: "openai-responses-images",
|
|
provider: "openai",
|
|
protocol: "openai-responses",
|
|
requires: ["OPENAI_API_KEY"],
|
|
})
|
|
|
|
describe("OpenAI Responses image generation recorded", () => {
|
|
recorded.effect("generates and edits an image with the hosted tool", () =>
|
|
Effect.gen(function* () {
|
|
const initial = Message.user("Generate a simple flat black triangle centered on a plain white background.")
|
|
const tools = [
|
|
OpenAI.imageGeneration({
|
|
action: "auto",
|
|
quality: "low",
|
|
size: "1024x1024",
|
|
outputFormat: "jpeg",
|
|
outputCompression: 10,
|
|
partialImages: 0,
|
|
}),
|
|
]
|
|
const response = yield* LLM.generate(
|
|
LLM.request({
|
|
model: openai.responses("gpt-5-mini"),
|
|
messages: [initial],
|
|
tools,
|
|
toolChoice: "image_generation",
|
|
}),
|
|
)
|
|
|
|
const result = response.events.find(LLMEvent.is.toolResult)
|
|
expect(result).toBeDefined()
|
|
expect(result?.providerExecuted).toBe(true)
|
|
expect(result?.result.type).toBe("content")
|
|
if (result?.result.type !== "content") return
|
|
expect(result.result.value).toHaveLength(1)
|
|
expect(result.result.value[0]?.type).toBe("file")
|
|
if (result.result.value[0]?.type !== "file") return
|
|
expect(result.result.value[0].mime).toBe("image/jpeg")
|
|
expect(result.result.value[0].uri.startsWith("data:image/jpeg;base64,")).toBe(true)
|
|
|
|
const edited = yield* LLM.generate(
|
|
LLM.request({
|
|
model: openai.responses("gpt-5-mini"),
|
|
messages: [initial, response.message, Message.user("Now make the triangle blue.")],
|
|
tools,
|
|
toolChoice: "image_generation",
|
|
}),
|
|
)
|
|
const editedResult = edited.events.find(LLMEvent.is.toolResult)
|
|
expect(editedResult?.result.type).toBe("content")
|
|
if (editedResult?.result.type !== "content") return
|
|
expect(editedResult.result.value[0]?.type).toBe("file")
|
|
}),
|
|
)
|
|
})
|