61 lines
1.5 KiB
TypeScript
61 lines
1.5 KiB
TypeScript
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}`);
|