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