UNPKG

replicate-flux-mcp

Version:
62 lines (61 loc) 2.27 kB
import { replicate } from "../services/replicate.js"; import { handleError } from "../utils/error.js"; import { mimeFor, outputToBase64 } from "../utils/image.js"; import { CONFIG } from "../config/index.js"; export const registerGenerateMultipleImagesTool = async (input, extra) => { const { prompts, ...commonParams } = input; const progressToken = extra._meta?.progressToken; const total = prompts.length; let done = 0; try { const notify = async (message) => { if (progressToken === undefined) return; await extra.sendNotification({ method: "notifications/progress", params: { progressToken, progress: done, total, message }, }); }; await notify(`Starting ${total} image generations`); const generationPromises = prompts.map(async (prompt) => { const [output] = (await replicate.run(CONFIG.imageModelId, { input: { prompt, ...commonParams }, })); const imageUrl = output.url(); const imageBase64 = await outputToBase64(output); done += 1; await notify(`Completed ${done}/${total}`); return { prompt, imageUrl, imageBase64 }; }); const results = await Promise.all(generationPromises); const mimeType = mimeFor(input.output_format); const content = [ { type: "text", text: `Generated ${results.length} images based on your prompts:`, }, ]; for (const result of results) { content.push({ type: "text", text: `\n\nPrompt: "${result.prompt}"\nImage URL: ${result.imageUrl}`, }); content.push({ type: "image", data: result.imageBase64, mimeType, }); } return { content, structuredContent: { images: results.map((r) => ({ url: r.imageUrl, prompt: r.prompt })), format: input.output_format, aspect_ratio: input.aspect_ratio, }, }; } catch (error) { return handleError(error); } };