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