| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | 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, |
| | }; |
| | } |
| |
|