@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
JavaScript
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;
;