UNPKG

exif-ai

Version:

A powerful Node.js CLI and library that uses AI providers (OpenAI, Google Gemini, Anthropic Claude, Mistral, Ollama, Amazon Bedrock, Azure OpenAI, DeepInfra, Fireworks, XAI, OpenRouter, and more) to intelligently write image descriptions and tags to EXIF

172 lines 4.64 kB
import { execute as executeCore } from "./index.js"; /** * Builder class for fluent API */ export class ExifAI { constructor(image) { this.config = { image, ai: { provider: "" }, }; } /** * Set AI provider */ provider(provider) { this.config.ai.provider = provider; return this; } /** * Set AI model */ model(model) { this.config.ai.model = model; return this; } /** * Set tasks to perform */ tasks(...tasks) { this.config.options ??= {}; this.config.options.tasks = tasks; return this; } /** * Set description prompt */ descriptionPrompt(prompt) { this.config.ai.descriptionPrompt = prompt; return this; } /** * Set tag prompt */ tagPrompt(prompt) { this.config.ai.tagPrompt = prompt; return this; } /** * Enable preview mode */ preview() { this.config.options ??= {}; this.config.options.preview = true; return this; } /** * Enable verbose output */ verbose() { this.config.options ??= {}; this.config.options.verbose = true; return this; } /** * Skip if tags already exist */ skipExisting() { this.config.options ??= {}; this.config.options.skipExisting = true; return this; } /** * Set retry attempts */ retries(count) { this.config.options ??= {}; this.config.options.retries = count; return this; } /** * Set EXIF tags for descriptions */ descriptionTags(...tags) { this.config.exif ??= {}; this.config.exif.descriptionTags = tags; return this; } /** * Set EXIF tags for tags */ tagTags(...tags) { this.config.exif ??= {}; this.config.exif.tagTags = tags; return this; } /** * Execute the processing */ async run() { if (!this.config.ai.provider) { throw new Error("AI provider is required"); } const options = this.config.options ?? {}; const exif = this.config.exif ?? {}; await executeCore({ path: this.config.image, provider: this.config.ai.provider, model: this.config.ai.model, tasks: options.tasks ?? ["description", "tag"], descriptionPrompt: this.config.ai.descriptionPrompt, tagPrompt: this.config.ai.tagPrompt, descriptionTags: exif.descriptionTags, tagTags: exif.tagTags, dry: options.preview ?? false, verbose: options.verbose ?? false, avoidOverwrite: options.skipExisting ?? false, repeat: options.retries ?? 0, writeArgs: exif.args, providerArgs: this.config.ai.args, }); } } /** * Simple function for common use cases */ export async function processImage(config) { const builder = new ExifAI(config.image) .provider(config.provider) .tasks(...(config.tasks ?? ["description", "tag"])); if (config.model) builder.model(config.model); if (config.descriptionPrompt) builder.descriptionPrompt(config.descriptionPrompt); if (config.tagPrompt) builder.tagPrompt(config.tagPrompt); if (config.preview) builder.preview(); if (config.verbose) builder.verbose(); await builder.run(); } /** * Advanced function with full configuration */ export async function processImageAdvanced(config) { const builder = new ExifAI(config.image).provider(config.ai.provider); if (config.ai.model) builder.model(config.ai.model); if (config.ai.descriptionPrompt) builder.descriptionPrompt(config.ai.descriptionPrompt); if (config.ai.tagPrompt) builder.tagPrompt(config.ai.tagPrompt); const options = config.options ?? {}; if (options.tasks) builder.tasks(...options.tasks); if (options.preview) builder.preview(); if (options.verbose) builder.verbose(); if (options.skipExisting) builder.skipExisting(); if (options.retries) builder.retries(options.retries); const exif = config.exif ?? {}; if (exif.descriptionTags) builder.descriptionTags(...exif.descriptionTags); if (exif.tagTags) builder.tagTags(...exif.tagTags); await builder.run(); } // Note: The execute function is now exported directly from index.ts //# sourceMappingURL=api.js.map