UNPKG

@devvai/devv-code-backend

Version:

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

97 lines (96 loc) 3.95 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DevvReplicate = void 0; const device_1 = require("./device"); const session_1 = require("./session"); const constants_1 = require("./constants"); /** * DevvReplicate - Replicate AI model integration * * Provides access to pre-approved high-quality AI models through Replicate. * API key is handled automatically by the backend service. * * Supported models: * - ideogram-ai/ideogram-v3-turbo: High-quality text-to-image generation * - black-forest-labs/flux-schnell: Fast, efficient image generation * - google/imagen-4-fast: Google's fast image generation model * - black-forest-labs/flux-kontext-pro: Professional context-aware generation * - prunaai/hidream-l1-fast: Optimized fast generation model * - luma/photon-flash: Ultra-fast photorealistic generation * * Usage: * ```typescript * const replicate = new DevvReplicate(); * const result = await replicate.textToImage({ * prompt: "a beautiful landscape", * model: "black-forest-labs/flux-schnell", * num_outputs: 2, * negative_prompt: "blurry, low quality" * }); * ``` * * Note: Authentication required. Make sure you are logged in via auth.verifyOTP() */ class DevvReplicate { async textToImage(options) { if (!options.prompt) { throw new Error('Prompt is required for text-to-image generation'); } if (!options.model) { throw new Error('Model is required for Replicate image generation'); } // Validate model is in allowed list if (!DevvReplicate.ALLOWED_MODELS.includes(options.model)) { throw new Error(`Invalid model: ${options.model}. Allowed models are: ${DevvReplicate.ALLOWED_MODELS.join(', ')}`); } // Build request body with all provided options const requestBody = { prompt: options.prompt, model: options.model, num_outputs: options.num_outputs ?? 1, ...(options.width && { width: options.width }), ...(options.height && { height: options.height }), ...(options.aspect_ratio && { aspect_ratio: options.aspect_ratio }), ...(options.output_format && { output_format: options.output_format }), ...(options.negative_prompt && { negative_prompt: options.negative_prompt }), ...(options.guidance_scale && { guidance_scale: options.guidance_scale }), ...(options.num_inference_steps && { num_inference_steps: options.num_inference_steps }), ...(options.seed && { seed: options.seed }), }; // Validate num_outputs range if (requestBody.num_outputs < 1 || requestBody.num_outputs > 4) { throw new Error('num_outputs must be between 1 and 4'); } 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/replicate/text-to-image`, { method: 'POST', headers, body: JSON.stringify(requestBody) }); if (!response.ok) { const error = await response.json().catch(() => ({ error: 'Replicate image generation failed' })); throw new Error(error.error || `Failed to generate image with Replicate (Status: ${response.status})`); } return await response.json(); } } exports.DevvReplicate = DevvReplicate; // Allowed text-to-image models DevvReplicate.ALLOWED_MODELS = [ 'ideogram-ai/ideogram-v3-turbo', 'black-forest-labs/flux-schnell', 'google/imagen-4-fast', 'black-forest-labs/flux-kontext-pro', 'prunaai/hidream-l1-fast', 'luma/photon-flash' ];