UNPKG

@polybiouslabs/polybious

Version:

Polybius is a next-generation intelligent agent framework built for adaptability across diverse domains. It merges contextual awareness, multi-agent collaboration, and predictive reasoning to deliver dynamic, self-optimizing performance.

241 lines (240 loc) 10.3 kB
import { BaseTool } from '../base-tool'; import OpenAI from 'openai'; import { logger } from '../../config/logger'; export class ImageGenerationTool extends BaseTool { openai; constructor() { super(); if (process.env.OPENAI_API_KEY) { this.openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); } } getConfig() { return { name: 'image_generation', description: 'Generate images from text descriptions using AI', parameters: { type: 'object', properties: { prompt: { type: 'string', description: 'Text description of the image to generate', maxLength: 1000 }, style: { type: 'string', description: 'Artistic style for the image', enum: ['photographic', 'digital-art', 'cartoon', 'sketch', 'abstract', 'realistic'], default: 'digital-art' }, size: { type: 'string', description: 'Size of the generated image', enum: ['256x256', '512x512', '1024x1024', '1792x1024', '1024x1792'], default: '1024x1024' }, quality: { type: 'string', description: 'Quality of the generated image', enum: ['standard', 'hd'], default: 'standard' }, n: { type: 'number', description: 'Number of images to generate', minimum: 1, maximum: 4, default: 1 } }, required: ['prompt'] }, handler: 'ImageGenerationTool', enabled: !!process.env.OPENAI_API_KEY, rateLimited: { maxCalls: 20, timeWindow: 60 } }; } validate(params) { if (!this.validateRequired(params, ['prompt'])) { return false; } if (typeof params.prompt !== 'string' || params.prompt.trim().length === 0) { return false; } if (params.n !== undefined && (typeof params.n !== 'number' || params.n < 1 || params.n > 4)) { return false; } return true; } async execute(params) { if (!this.openai) { throw new Error('OpenAI API key not configured. Set OPENAI_API_KEY environment variable.'); } const { prompt, style = 'digital-art', size = '1024x1024', quality = 'standard', n = 1 } = this.sanitizeParams(params); try { logger.info('Generating image', { prompt: prompt.substring(0, 100), style, size, quality, n }); // Enhance prompt with style const enhancedPrompt = this.enhancePrompt(prompt, style); const response = await this.openai.images.generate({ model: 'dall-e-3', prompt: enhancedPrompt, size: size, quality: quality, n: n, response_format: 'url' }); const images = response.data?.map((image, index) => ({ url: image.url, revisedPrompt: image.revised_prompt, index, metadata: { originalPrompt: prompt, enhancedPrompt, style, size, quality, generatedAt: new Date().toISOString() } })) || []; return { prompt, enhancedPrompt, style, size, quality, count: images.length, images, usage: { model: 'dall-e-3', totalTokens: enhancedPrompt.length }, timestamp: new Date().toISOString() }; } catch (error) { logger.error('Image generation failed', { error, prompt: prompt.substring(0, 100) }); throw new Error(`Image generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`); } } enhancePrompt(prompt, style) { const styleEnhancements = { 'photographic': 'high-quality photograph, professional lighting, sharp focus, realistic', 'digital-art': 'digital artwork, vibrant colors, detailed, artistic composition', 'cartoon': 'cartoon style, colorful, playful, animated character design', 'sketch': 'pencil sketch, hand-drawn, artistic linework, black and white or minimal color', 'abstract': 'abstract art, creative interpretation, unique perspective, artistic expression', 'realistic': 'photorealistic, highly detailed, natural lighting, lifelike appearance' }; const enhancement = styleEnhancements[style] || styleEnhancements['digital-art']; return `${prompt}, ${enhancement}`; } transform(result) { return { ...result, socialMediaReady: this.prepareSocialMediaVersions(result), accessibility: this.generateAccessibilityInfo(result), suggestions: this.generateSuggestions(result) }; } prepareSocialMediaVersions(result) { const { images, style } = result; // Generate captions and hashtags for social media return images.map((image) => ({ ...image, socialMedia: { caption: this.generateCaption(result.prompt, style), hashtags: this.generateHashtags(result.prompt, style), platforms: { twitter: { recommended: true, note: 'Perfect for Twitter posts with visual content' }, instagram: { recommended: result.size.includes('1024'), note: result.size.includes('1024') ? 'Great for Instagram posts' : 'Consider using square format for Instagram' }, facebook: { recommended: true, note: 'Works well for Facebook posts and stories' } } } })); } generateCaption(prompt, style) { const captions = [ `Just created this amazing ${style} artwork! ✨`, `AI-generated ${style} bringing imagination to life 🎨`, `When technology meets creativity... ${style} magic! 🚀`, `Exploring new artistic horizons with ${style} 🌟` ]; return captions[Math.floor(Math.random() * captions.length)]; } generateHashtags(prompt, style) { const baseHashtags = ['#AI', '#ArtificialIntelligence', '#GeneratedArt', '#DigitalArt', '#Creative']; const styleHashtags = { 'photographic': ['#Photography', '#AIPhotography', '#PhotoRealistic'], 'digital-art': ['#DigitalArt', '#ConceptArt', '#DigitalPainting'], 'cartoon': ['#Cartoon', '#Animation', '#CharacterDesign'], 'sketch': ['#Sketch', '#Drawing', '#ArtSketch'], 'abstract': ['#AbstractArt', '#ModernArt', '#AbstractExpression'], 'realistic': ['#Realistic', '#Photorealistic', '#DetailedArt'] }; const keywordHashtags = prompt.toLowerCase() .split(/\s+/) .filter(word => word.length > 3) .slice(0, 3) .map(word => `#${word.charAt(0).toUpperCase() + word.slice(1)}`); return [ ...baseHashtags, ...(styleHashtags[style] || []), ...keywordHashtags ].slice(0, 10); } generateAccessibilityInfo(result) { return { altText: this.generateAltText(result.prompt, result.style), description: this.generateDescription(result.prompt, result.style), colorAnalysis: this.analyzeColors(result.style) }; } generateAltText(prompt, style) { return `AI-generated ${style} image depicting ${prompt.substring(0, 100)}`; } generateDescription(prompt, style) { return `This is a ${style}-style image created using artificial intelligence. The image shows ${prompt}. The artwork demonstrates the capabilities of AI in creative visual generation.`; } analyzeColors(style) { const colorProfiles = { 'photographic': { dominant: 'natural', saturation: 'moderate', brightness: 'balanced' }, 'digital-art': { dominant: 'vibrant', saturation: 'high', brightness: 'bright' }, 'cartoon': { dominant: 'primary', saturation: 'high', brightness: 'bright' }, 'sketch': { dominant: 'monochrome', saturation: 'low', brightness: 'varied' }, 'abstract': { dominant: 'varied', saturation: 'mixed', brightness: 'dynamic' }, 'realistic': { dominant: 'natural', saturation: 'balanced', brightness: 'realistic' } }; return colorProfiles[style] || colorProfiles['digital-art']; } generateSuggestions(result) { const suggestions = []; if (result.count === 1) { suggestions.push('Consider generating multiple variations for more options'); } if (result.size === '256x256') { suggestions.push('Try larger sizes for higher quality social media posts'); } if (result.style === 'sketch') { suggestions.push('Sketch style works great for minimalist social media aesthetics'); } if (result.prompt.length < 50) { suggestions.push('More detailed prompts can produce more specific and interesting results'); } suggestions.push('Use the generated hashtags to improve discoverability on social media'); return suggestions; } }