UNPKG

@devvai/devv-code-backend

Version:

Backend SDK for Devv Code - Provides authentication, data management, email and AI capabilities

97 lines (96 loc) 3.72 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DevvImageGen = void 0; const device_1 = require("./device"); const session_1 = require("./session"); const constants_1 = require("./constants"); /** * DevvImageGen - AI-powered image generation * * Supports multiple models: * * 1. **Default Model** (no model parameter): * Free text-to-image generation with full options support. * ```typescript * const imageGen = new DevvImageGen(); * const result = await imageGen.textToImage({ * prompt: "a red cat", * num_outputs: 2, * aspect_ratio: "16:9", * output_format: "png" * }); * ``` * * 2. **Google Gemini Model** (`google/gemini-2.5-flash-image`): * Supports both text-to-image and image-to-image generation: * - Text-to-image: Provide `prompt` only * - Image-to-image: Provide `prompt` and `image_url` or `image_urls` for transformations * - `output_format` must be "jpg" or "png" only * - Other parameters (num_outputs, aspect_ratio) may be ignored * * ```typescript * // Text-to-image * const result = await imageGen.textToImage({ * prompt: "a futuristic city", * model: "google/gemini-2.5-flash-image", * output_format: "jpg" // Only "jpg" or "png" supported * }); * * // Image-to-image transformation * const transformed = await imageGen.textToImage({ * prompt: "update the text to black", * model: "google/gemini-2.5-flash-image", * image_url: "https://static.copilothub.ai/text-to-image/ew99kcw0c45c.png", * output_format: "png" * }); * ``` * * For other advanced models requiring API keys, use DevvReplicate instead. */ class DevvImageGen { async textToImage(options) { if (!options.prompt) { throw new Error('Prompt is required for text-to-image generation'); } // Build request body with all provided options const requestBody = { prompt: options.prompt, ...(options.model && { model: options.model }), ...(options.image_url && { image_url: options.image_url }), ...(options.image_urls && { image_urls: options.image_urls }), ...(options.num_outputs !== undefined && { num_outputs: options.num_outputs }), ...(options.aspect_ratio && { aspect_ratio: options.aspect_ratio }), ...(options.output_format && { output_format: options.output_format }) }; // Validate num_outputs range if provided (for default model) if (!options.model && requestBody.num_outputs !== undefined) { if (requestBody.num_outputs < 1 || requestBody.num_outputs > 4) { throw new Error('num_outputs must be between 1 and 4'); } } // Set default num_outputs for default model if not provided if (!options.model && requestBody.num_outputs === undefined) { requestBody.num_outputs = 1; } const deviceId = (0, device_1.getEncryptedDeviceId)(); const sid = (0, session_1.getSid)(); const headers = { 'Content-Type': 'application/json', 'Device-Id': deviceId }; if (sid) { headers['sid'] = sid; } const response = await fetch(`${constants_1.BASE_URL}api/v1/text-to-image`, { method: 'POST', headers, body: JSON.stringify(requestBody) }); if (!response.ok) { const error = await response.json().catch(() => ({ error: 'Text-to-image generation failed' })); throw new Error(error.error || `Failed to generate image (Status: ${response.status})`); } return await response.json(); } } exports.DevvImageGen = DevvImageGen;