ai-image
Version:
A unified wrapper for image generation inference APIs (OpenAI and Replicate) with CLI support, useful for MCP and sub-processes
147 lines ⢠6.55 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const commander_1 = require("commander");
const index_1 = require("./index");
const path_1 = __importDefault(require("path"));
const dotenv_1 = __importDefault(require("dotenv"));
// Load environment variables
dotenv_1.default.config();
const program = new commander_1.Command();
program
.name('ai-image')
.description('Generate images using OpenAI or Replicate APIs')
.version('1.0.0');
program
.command('generate')
.alias('gen')
.description('Generate an image from a text prompt')
.option('--prompt <prompt>', 'Text prompt for image generation')
.option('-p, --provider <provider>', 'Provider to use (openai or replicate)', 'openai')
.option('-k, --api-key <key>', 'API key (overrides environment variable)')
.option('-o, --output <path>', 'Output file path')
.option('-d, --output-dir <dir>', 'Output directory', process.cwd())
.option('-m, --model <model>', 'Model to use (provider-specific)')
.option('-s, --size <size>', 'Image size (1024x1024, 1536x1024, 1024x1536, auto)', '1024x1024')
.option('-q, --quality <quality>', 'Image quality (low, medium, high, auto) - OpenAI only', 'auto')
.option('-f, --format <format>', 'Output format (png, jpeg, webp) - OpenAI only', 'png')
.option('-c, --compression <compression>', 'Compression level 0-100% for JPEG/WebP - OpenAI only')
.option('-b, --background <background>', 'Background (transparent, opaque) - OpenAI only')
.option('--debug', 'Enable debug logging to show full request parameters')
.option('-n, --number <n>', 'Number of images to generate', '1')
.action(async (options) => {
try {
if (options.debug) {
console.log('š CLI Debug - Received parameters:');
console.log('Prompt:', options.prompt);
console.log('Options:', JSON.stringify(options, null, 2));
}
if (!options.prompt) {
console.error('Error: Prompt is required. Use --prompt "your prompt text"');
process.exit(1);
}
const provider = options.provider.toLowerCase();
if (!['openai', 'replicate'].includes(provider)) {
console.error('Error: Provider must be either "openai" or "replicate"');
process.exit(1);
}
let outputDir = options.outputDir;
let outputFilename = options.output;
// If output is provided as a full path
if (options.output) {
const parsed = path_1.default.parse(options.output);
if (parsed.dir) {
outputDir = parsed.dir;
outputFilename = parsed.base;
}
}
const generator = new index_1.ImageGenerator({
provider,
apiKey: options.apiKey,
outputDir,
outputFilename
});
// Loading animation with provider-specific message
const providerText = provider === 'openai' ? 'OpenAI' : 'Replicate';
const loadingFrames = ['ā ', 'ā ', 'ā ¹', 'ā ø', 'ā ¼', 'ā “', 'ā ¦', 'ā §', 'ā ', 'ā '];
let frameIndex = 0;
let startTime = Date.now();
const loadingInterval = setInterval(() => {
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
process.stdout.write(`\r${loadingFrames[frameIndex]} Processing @ ${providerText} (${elapsed}s)...`);
frameIndex = (frameIndex + 1) % loadingFrames.length;
}, 9000);
try {
const generateOptions = {
prompt: options.prompt,
model: options.model,
size: options.size,
quality: options.quality,
n: parseInt(options.number)
};
// Add optional parameters
if (options.format)
generateOptions.format = options.format;
if (options.compression)
generateOptions.compression = parseInt(options.compression);
if (options.background)
generateOptions.background = options.background;
if (options.debug)
generateOptions.debug = true;
if (options.debug) {
console.log('šØ Generating image with openai...', generateOptions);
}
const savedPaths = await generator.generate(generateOptions);
clearInterval(loadingInterval);
process.stdout.write('\r');
console.log(`ā
Image(s) generated successfully!`);
savedPaths.forEach((path) => {
console.log(`š Saved to: ${path}`);
});
}
catch (generationError) {
clearInterval(loadingInterval);
process.stdout.write('\r');
throw generationError;
}
}
catch (error) {
console.error('ā Error:', error instanceof Error ? error.message : 'Unknown error');
process.exit(1);
}
});
// Add a command to list available models
program
.command('models')
.description('List available models for each provider')
.action(() => {
console.log('\nš Available Models:\n');
console.log('OpenAI:');
console.log(' - gpt-image-1 (default, new GPT image model)');
console.log(' - dall-e-2 (legacy DALL-E model)');
console.log('\nReplicate:');
console.log(' - stability-ai/sdxl (default)');
console.log(' - stability-ai/stable-diffusion');
console.log(' - Any model from replicate.com in format "owner/model:version"');
console.log('\nš” Tip: Check replicate.com/explore for more models');
});
// Add a command to show environment setup
program
.command('setup')
.description('Show how to set up API keys')
.action(() => {
console.log('\nš§ Setup Instructions:\n');
console.log('1. Create a .env file in your project root');
console.log('2. Add your API keys:\n');
console.log(' OPENAI_API_KEY=your_openai_api_key_here');
console.log(' REPLICATE_API_TOKEN=your_replicate_token_here\n');
console.log('3. Or pass API keys directly with --api-key flag\n');
console.log('š Get your API keys:');
console.log(' - OpenAI: https://platform.openai.com/api-keys');
console.log(' - Replicate: https://replicate.com/account/api-tokens');
});
program.parse();
//# sourceMappingURL=cli.js.map