| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| import { storagePut } from "server/storage"; |
| import { ENV } from "./env"; |
|
|
| export type GenerateImageOptions = { |
| prompt: string; |
| originalImages?: Array<{ |
| url?: string; |
| b64Json?: string; |
| mimeType?: string; |
| }>; |
| }; |
|
|
| export type GenerateImageResponse = { |
| url?: string; |
| }; |
|
|
| export async function generateImage( |
| options: GenerateImageOptions |
| ): Promise<GenerateImageResponse> { |
| if (!ENV.forgeApiUrl) { |
| throw new Error("BUILT_IN_FORGE_API_URL is not configured"); |
| } |
| if (!ENV.forgeApiKey) { |
| throw new Error("BUILT_IN_FORGE_API_KEY is not configured"); |
| } |
|
|
| |
| const baseUrl = ENV.forgeApiUrl.endsWith("/") |
| ? ENV.forgeApiUrl |
| : `${ENV.forgeApiUrl}/`; |
| const fullUrl = new URL( |
| "images.v1.ImageService/GenerateImage", |
| baseUrl |
| ).toString(); |
|
|
| const response = await fetch(fullUrl, { |
| method: "POST", |
| headers: { |
| accept: "application/json", |
| "content-type": "application/json", |
| "connect-protocol-version": "1", |
| authorization: `Bearer ${ENV.forgeApiKey}`, |
| }, |
| body: JSON.stringify({ |
| prompt: options.prompt, |
| original_images: options.originalImages || [], |
| }), |
| }); |
|
|
| if (!response.ok) { |
| const detail = await response.text().catch(() => ""); |
| throw new Error( |
| `Image generation request failed (${response.status} ${response.statusText})${detail ? `: ${detail}` : ""}` |
| ); |
| } |
|
|
| const result = (await response.json()) as { |
| image: { |
| b64Json: string; |
| mimeType: string; |
| }; |
| }; |
| const base64Data = result.image.b64Json; |
| const buffer = Buffer.from(base64Data, "base64"); |
|
|
| |
| const { url } = await storagePut( |
| `generated/${Date.now()}.png`, |
| buffer, |
| result.image.mimeType |
| ); |
| return { |
| url, |
| }; |
| } |
|
|