import { createOpenAICompatible } from "@ai-sdk/openai-compatible"; import { generateImage } from "ai"; import index from "./index.html"; const server = Bun.serve({ hostname: "0.0.0.0", routes: { "/": index, "/api/generate": { POST: async (req) => { try { const { baseURL, apiKey, model, prompt, size } = (await req.json()) as { baseURL?: string; apiKey?: string; model?: string; prompt?: string; size?: `${number}x${number}`; }; if (!baseURL || !apiKey || !model || !prompt) { return Response.json( { error: "baseURL, apiKey, model, prompt are required" }, { status: 400 }, ); } const provider = createOpenAICompatible({ name: "custom", apiKey, baseURL, }); const { images } = await generateImage({ model: provider.imageModel(model), prompt, size: size || "1024x1024", }); const out = images.map((img) => { const mediaType = (img as { mediaType?: string }).mediaType ?? "image/png"; const base64 = (img as { base64?: string }).base64; return base64 ? `data:${mediaType};base64,${base64}` : null; }).filter(Boolean); return Response.json({ images: out }); } catch (err) { const message = err instanceof Error ? err.message : String(err); console.error("[generate] error:", err); return Response.json({ error: message }, { status: 500 }); } }, }, }, development: { hmr: true, console: true, }, }); console.log(`Listening on ${server.url}`);