{"id":285783,"date":"2026-04-23T00:29:37","date_gmt":"2026-04-23T00:29:37","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ai-media-auto-tagger\/"},"modified":"2026-09-14T17:10:36","modified_gmt":"2026-09-14T17:10:36","slug":"altgenix-ai-image-seo","status":"publish","type":"plugin","link":"https:\/\/tw.wordpress.org\/plugins\/altgenix-ai-image-seo\/","author":23459305,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.1","stable_tag":"1.2.1","tested":"7.1.1","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"AltGenix AI Image SEO","header_author":"Abdul Kabeer","header_description":"Automatically generate SEO-optimized Alt Text, Titles, and Descriptions for uploaded images using Google Gemini Vision AI.","assets_banners_color":"09113e","last_updated":"2026-09-14 17:10:36","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/kabeer-qureshi\/altgenix-ai-image-seo\/","header_author_uri":"https:\/\/www.linkedin.com\/in\/abdulkabeerdeveloper","rating":5,"author_block_rating":0,"active_installs":30,"downloads":1564,"num_ratings":1,"support_threads":1,"support_threads_resolved":1,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"abdulkabeerdeveloper2530","date":"2026-04-29 21:28:12","revision":3518972},"1.0.1":{"tag":"1.0.1","author":"abdulkabeerdeveloper2530","date":"2026-04-29 21:28:12","revision":3518972},"1.1.0":{"tag":"1.1.0","author":"abdulkabeerdeveloper2530","date":"2026-06-29 14:24:02","revision":3590221},"1.1.1":{"tag":"1.1.1","author":"abdulkabeerdeveloper2530","date":"2026-07-08 13:23:58","revision":3600369},"1.1.2":{"tag":"1.1.2","author":"abdulkabeerdeveloper2530","date":"2026-08-25 14:50:07","revision":3665529},"1.2.0":{"tag":"1.2.0","author":"abdulkabeerdeveloper2530","date":"2026-09-12 17:30:24","revision":3692960},"1.2.1":{"tag":"1.2.1","author":"abdulkabeerdeveloper2530","date":"2026-09-14 17:10:36","revision":3695656}},"upgrade_notice":{"1.2.1":"<p>Fixes two faults introduced in 1.2.0: image uploads could hang on &quot;Crunching...&quot; forever, and the &quot;choose what to regenerate&quot; field selection was ignored. Recommended for everyone on 1.2.0.<\/p>","1.2.0":"<p>Security and data-integrity fixes: server-side keys, safe file copies, reliable queues and strict AI validation. Rotate keys if a previous build exposed them to untrusted uploaders. Back up and test on staging first.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3513280,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3590247,"resolution":"772x250","location":"assets","locale":"","width":2203,"height":714}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.1.0","1.1.1","1.1.2","1.2.0","1.2.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3692958,"resolution":"1","location":"assets","locale":"","width":1672,"height":941},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3692958,"resolution":"2","location":"assets","locale":"","width":1672,"height":941},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3692958,"resolution":"3","location":"assets","locale":"","width":1672,"height":941},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3692958,"resolution":"4","location":"assets","locale":"","width":1672,"height":941}},"screenshots":{"1":"Configure AltGenix AI Image SEO, choose your provider and model, and manage API verification.","2":"Bulk optimize multiple images with selection controls, status badges, and bulk actions.","3":"Generate image metadata directly from the WordPress Media Library attachment details screen.","4":"Choose exactly which image fields to regenerate, including filename options, from a focused popup."}},"plugin_section":[],"plugin_tags":[248140,229563,29161,194533,186],"plugin_category":[55],"plugin_contributors":[260879],"plugin_business_model":[],"class_list":["post-285783","plugin","type-plugin","status-publish","hentry","plugin_tags-auto-alt-text","plugin_tags-claude","plugin_tags-image-optimization","plugin_tags-openai","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_contributors-abdulkabeerdeveloper2530","plugin_committers-abdulkabeerdeveloper2530"],"banners":{"banner":"https:\/\/ps.w.org\/altgenix-ai-image-seo\/assets\/banner-772x250.png?rev=3590247","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/altgenix-ai-image-seo\/assets\/icon-256x256.png?rev=3513280","icon_2x":"https:\/\/ps.w.org\/altgenix-ai-image-seo\/assets\/icon-256x256.png?rev=3513280","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/altgenix-ai-image-seo\/assets\/screenshot-1.png?rev=3692958","caption":"Configure AltGenix AI Image SEO, choose your provider and model, and manage API verification."},{"src":"https:\/\/ps.w.org\/altgenix-ai-image-seo\/assets\/screenshot-2.png?rev=3692958","caption":"Bulk optimize multiple images with selection controls, status badges, and bulk actions."},{"src":"https:\/\/ps.w.org\/altgenix-ai-image-seo\/assets\/screenshot-3.png?rev=3692958","caption":"Generate image metadata directly from the WordPress Media Library attachment details screen."},{"src":"https:\/\/ps.w.org\/altgenix-ai-image-seo\/assets\/screenshot-4.png?rev=3692958","caption":"Choose exactly which image fields to regenerate, including filename options, from a focused popup."}],"raw_content":"<!--section=description-->\n<p>AltGenix generates image alt text, titles, captions and descriptions from a filename or your selected AI provider. Review generated text for accuracy and accessibility before publishing.<\/p>\n\n<ul>\n<li>Choose Google Gemini, OpenAI, Anthropic Claude or DeepSeek with your own API key.<\/li>\n<li>Enable each metadata field separately and choose the output language and length.<\/li>\n<li>Automatically process new uploads after WordPress finishes preparing them, or run through pending images in the Bulk Optimizer.<\/li>\n<li>Retry failed images without losing existing metadata. Bulk runs continue past failed batches.<\/li>\n<li>Optional AI filename generation copies the main image, original and thumbnails to new names. Existing embeds continue to use retained files, so old URLs remain valid. Copies require additional disk space.<\/li>\n<li>File renaming does not perform global search-and-replace in posts, builder data, serialized metadata or attachment GUIDs. New attachment-based output uses the current filename; existing hardcoded URLs retain the previous name.<\/li>\n<li>API credentials remain on the server. Authentication is checked using model discovery; account credits and generation access are checked during processing.<\/li>\n<\/ul>\n\n<h3>External Services<\/h3>\n\n<p>Filename mode makes no AI requests. AI mode sends a local image copy and the generation prompt (including any custom prompt) only to your selected provider. The API key authenticates these requests. Verification requests send the key to the provider's model-list endpoint; they do not generate an image or description. Model discovery does not guarantee credits, generation permissions or service availability.<\/p>\n\n<ul>\n<li>Google Gemini: https:\/\/ai.google.dev\/ | Terms: https:\/\/ai.google.dev\/gemini-api\/terms | Privacy: https:\/\/policies.google.com\/privacy<\/li>\n<li>OpenAI: https:\/\/openai.com\/api\/ | Terms: https:\/\/openai.com\/policies\/terms-of-use | Privacy: https:\/\/openai.com\/policies\/privacy-policy<\/li>\n<li>Anthropic Claude: https:\/\/www.anthropic.com\/ | Terms: https:\/\/www.anthropic.com\/legal\/commercial-terms | Privacy: https:\/\/www.anthropic.com\/legal\/privacy<\/li>\n<li>DeepSeek: https:\/\/api-docs.deepseek.com\/ | Terms: https:\/\/cdn.deepseek.com\/policies\/en-US\/deepseek-terms-of-use.html | Privacy: https:\/\/cdn.deepseek.com\/policies\/en-US\/deepseek-privacy-policy.html<\/li>\n<\/ul>\n\n<p>Optional feedback is sent only when you click Submit Feedback. It emails your message, rating, site URL, WordPress account email, plugin version and provider name to the developer at abdulkabeer2530@gmail.com using your site's mail transport. API keys are not included. Public reviews are available regardless of your rating. Service links open only when clicked; no advertising trackers or remote assets are loaded by the plugin.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>altgenix-ai-image-seo<\/code> directory to <code>\/wp-content\/plugins\/<\/code>, or install the ZIP from Plugins &gt; Add New.<\/li>\n<li>Activate AltGenix AI Image SEO.<\/li>\n<li>Open AltGenix AI &gt; Settings and choose Filename or AI mode.<\/li>\n<li>In AI mode select a provider, enter its API key and save. Provider charges may apply when generating metadata.<\/li>\n<li>Choose the fields to generate. Automatic processing is enabled by default; optional renaming is disabled on a fresh installation.<\/li>\n<li>Use Bulk Optimizer for existing images. Save pending attachment\/editor edits before regenerating metadata.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20happens%20if%20the%20ai%20fails%3F\"><h3>What happens if the AI fails?<\/h3><\/dt>\n<dd><p>Existing metadata is preserved and the image remains in the Failed list for an explicit retry. No failed, incomplete, refused or malformed AI response is marked as successfully optimized. Choose Filename mode explicitly if you want metadata derived from filenames.<\/p><\/dd>\n<dt id=\"what%20if%20generated%20text%20succeeds%20but%20renaming%20fails%3F\"><h3>What if generated text succeeds but renaming fails?<\/h3><\/dt>\n<dd><p>Generated text is retained, but the image is reported as failed until the filename issue is resolved. Repair the reported file problem and use the retry rename action to reuse the saved AI filename without another AI request.<\/p><\/dd>\n<dt id=\"does%20processing%20overwrite%20my%20text%3F\"><h3>Does processing overwrite my text?<\/h3><\/dt>\n<dd><p>A successful run replaces enabled fields. Disabled fields remain unchanged. All fields OFF makes processing a no-op. Back up your media metadata before bulk regeneration. The plugin cannot determine whether an empty alt attribute was deliberately chosen for a decorative image.<\/p><\/dd>\n<dt id=\"how%20do%20i%20remove%20an%20api%20key%3F\"><h3>How do I remove an API key?<\/h3><\/dt>\n<dd><p>A blank key field retains the stored key. Use the explicit Remove Key button to delete the selected provider's key and switch to Filename mode. Other providers' stored keys remain available when switching providers.<\/p><\/dd>\n<dt id=\"do%20renamed%20files%20replace%20every%20url%20on%20my%20site%3F\"><h3>Do renamed files replace every URL on my site?<\/h3><\/dt>\n<dd><p>No. Only the attachment's file references are updated. Old originals and sizes are retained for existing embeds and cached URLs. The plugin intentionally avoids replacing serialized content or GUIDs. Retained files are not deleted on uninstall; audit references before removing backups manually.<\/p><\/dd>\n<dt id=\"are%20images%20processed%20without%20an%20administrator%20page%20open%3F\"><h3>Are images processed without an administrator page open?<\/h3><\/dt>\n<dd><p>Uploads schedule WordPress cron processing after image preparation finishes. WordPress cron needs site traffic or a working server cron. On media\/editor pages a browser queue also processes ready uploads. A failed image is retried from Bulk Optimizer, not repeatedly charged in the background.<\/p><\/dd>\n<dt id=\"what%20about%20offloaded%20or%20unsupported%20files%3F\"><h3>What about offloaded or unsupported files?<\/h3><\/dt>\n<dd><p>A readable local copy inside this site's uploads directory is required. Suitable uncropped generated sizes are preferred; otherwise WordPress's image editor attempts a temporary JPEG conversion. When the host cannot read or convert a format, the failure is reported and existing metadata stays intact.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20support%20multisite%3F\"><h3>Does the plugin support multisite?<\/h3><\/dt>\n<dd><p>Settings and queues are per-site. Network uninstall clears plugin settings, jobs and temporary diagnostics for each site while preserving generated metadata, processed-status history, rename history and retained image backups so a reinstall does not make optimized media Pending again.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Fix: Uploading an image could leave the media uploader stuck on \"Crunching...\" and never finish. A PHP warning raised on every upload was corrupting the response the uploader waits for. The images were still being tagged correctly underneath, but the screen never said so. Introduced in 1.2.0.<\/li>\n<li>Fix: \"Choose what to regenerate\" now limits the run to the fields you actually tick. The selection was being discarded, so a manual regeneration always used the saved Generation Control toggles instead. Introduced in 1.2.0.<\/li>\n<li>Fix: Rating five stars no longer opens the \"tell us what went wrong\" form alongside the review link. Low ratings get the feedback form, high ratings get the review link.<\/li>\n<li>Fix: \"Regenerate Selected\" now shows the progress bar while it works, instead of leaving the screen looking frozen, and the bar is cleared when the run ends rather than staying on screen.<\/li>\n<li>New: Bulk runs can be stopped. A Stop button sits with the progress bar and halts the run after the image in flight finishes, so nothing is left half-written.<\/li>\n<li>Fix: A failed image now turns red and shows the error in the list instead of still reading \"Pending\", and a processed image shows its new title instead of \"Awaiting Action...\" beside a green badge.<\/li>\n<li>Fix: Regenerating in Original Filename mode now marks the row as processed. It completed correctly but the status badge never updated.<\/li>\n<li>New: The queue list has a rows-per-page control (10, 25, 50 or 100), so a selection is no longer capped at ten images.<\/li>\n<li>Fix: The queue table scrolls on its own on narrow screens instead of stretching the page sideways.<\/li>\n<li>Fix: The settings screen reopens on the tab you were last using, and the tabs can be operated with the arrow keys.<\/li>\n<li>Fix: Buttons that are switched off now look switched off. The confirm button in the regenerate dialog and Save during a save stayed fully coloured, so pressing them appeared to do nothing.<\/li>\n<li>Fix: Notifications no longer cover the Save button, can be dismissed with a close button, stay put while the pointer is over them, and errors remain readable for longer.<\/li>\n<li>Fix: A request that simply took too long is reported as a timeout instead of claiming the login had expired.<\/li>\n<li>Fix: The result of a file rename is reported, including partial failures and how many old files were removed. That detail was being produced and then discarded.<\/li>\n<li>Fix: When this site cannot send email, the feedback form now shows the support-forum link it points you to.<\/li>\n<li>Fix: Help tooltips open on keyboard focus and on touch, not only on mouse hover.<\/li>\n<li>Fix: Confirmation dialogs close when the dimmed area around them is clicked.<\/li>\n<li>Fix: The buttons on the Media Library and attachment screens respond to hover and show a visible keyboard focus ring.<\/li>\n<li>New: Automatic processing after an upload now says what it is doing instead of running silently.<\/li>\n<li>Change: The background check for new uploads slows down while there is nothing to do, reducing repeated admin-ajax requests on media screens.<\/li>\n<li>Change: Dismissing the services banner keeps it hidden for thirty days instead of one.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New: DeepSeek added as a fourth AI provider, using its vision-capable deepseek-flash model \u2014 a lower-cost option for high-volume image tagging. Requested on the support forum. Note that DeepSeek has no free tier, so the account needs a prepaid balance.<\/li>\n<li>Note: DeepSeek offers image input on deepseek-flash only (deepseek-v4-pro is text-only), so this provider runs a single model rather than the multi-model fallback chain used by Gemini, OpenAI and Claude.<\/li>\n<li>Fix: Switching AI Provider without saving no longer loses the saved provider's API key. Unsaved keys are now kept separately per provider for the current page session and restored when you switch back.<\/li>\n<li>Fix: Verified AI Model and escalation controls are hidden immediately when a different, unsaved provider is selected, preventing a stale model list from appearing under the wrong provider.<\/li>\n<li>Security: Per-image AJAX processing now verifies that the current user can edit the requested attachment. Global bulk actions require administrator capability.<\/li>\n<li>Data safety: Provider\/JSON errors are now stored in private <code>_altgenix_error<\/code> attachment meta instead of overwriting the Media Library Description field. Error placeholders written into Descriptions by earlier versions are moved into that private meta by a one-time migration, which restores the Description field.<\/li>\n<li>Fix: A fresh install now behaves the way the Settings screen shows it. Alt Text, Title and Rename were displayed as ON before anything was saved, but the processor read the missing option as OFF \u2014 so the first uploads generated nothing and were still marked as processed. Defaults are now written on activation and shared by the screen and the processor.<\/li>\n<li>Data safety: A temporary AI failure can no longer replace Alt Text, Titles, Captions or Descriptions you wrote yourself. When the provider is rate limited or unreachable, filename text is only used to fill fields that are still empty, and the image stays in the Failed list so a later run can still generate proper AI text for it.<\/li>\n<li>Fix: \"Process All Pending\" now works through the whole library instead of stopping after the first 100 images, and it retries images whose previous run failed. The completion message reports how many succeeded and how many failed rather than always claiming the library is optimized.<\/li>\n<li>Fix: File renaming is far safer. It now waits until WordPress has finished preparing an image before touching anything, so a rename can no longer happen while thumbnails are still being generated from the file. Sizes that share one generated file are all updated together instead of leaving some pointing at a filename that is gone, the untouched original kept beside a scaled upload is renamed in step, and any move that does not actually happen keeps its old working filename and is reported instead of being silently ignored.<\/li>\n<li>Fix: Clicking Regenerate on an image the plugin is already processing no longer starts a second request for it. That could send the same image to the AI twice \u2014 billed twice \u2014 with whichever reply arrived last deciding the metadata. It now reports that the image is busy.<\/li>\n<li>Fix: GIFs, and HEIC\/HEIF on Google Gemini, now appear in the Bulk Optimizer and the upload queue. They were accepted on upload and handled by the AI, but every screen filtered them out, so they could only ever be processed by the background task.<\/li>\n<li>Fix: Deleting the plugin now also clears the background processing events it scheduled, instead of leaving WP-Cron holding jobs whose handler is gone.<\/li>\n<li>Fix: The \"Optimize with AltGenix\" button in the Media Library is shown only to administrators. It links to the Bulk Optimizer, which is an administrator screen, so anyone else was sent to a permission error.<\/li>\n<li>New: Save Settings now follows you down the page instead of waiting at the bottom, so it is reachable from any tab without scrolling. It tells you when there are unsaved changes, warns you if you navigate away with some, and Ctrl+S (Cmd+S on Mac) saves.<\/li>\n<li>Fix: Buttons rendered as links no longer turn admin-blue when hovered or focused. The plugin styles them explicitly in every link state instead of leaving it to the WordPress admin stylesheet.<\/li>\n<li>New: A banner at the top of the AltGenix settings and Bulk Optimizer screens offers development and SEO help for the rest of your site.<\/li>\n<li>New: Once the plugin has tagged a meaningful number of images, a dismissible notice on the Media Library offers a free short review of the rest of your site. It appears on the media screens only, never elsewhere in wp-admin, and dismissing it hides it permanently.<\/li>\n<li>New: The Help screen now says who builds the plugin and what else they can help with \u2014 WordPress and CMS development, technical SEO, site speed and migrations \u2014 with a free short review on offer. A compact version appears once on the Bulk Optimizer and can be hidden permanently. It is confined to this plugin's own screens: no dashboard notices, nothing on the front of your site, and nothing is sent anywhere unless you click a link yourself.<\/li>\n<li>Fix: Auto-processing a new upload now reports a provider failure in the browser instead of showing success while the image was quietly marked as failed.<\/li>\n<li>Fix: Gemini model discovery no longer offers image-generation models such as gemini-3.1-flash-image and gemini-3-pro-image, which return pictures rather than the text metadata this plugin needs.<\/li>\n<li>Fix: Gemini requests no longer pin a reduced temperature. Google's guidance for Gemini 3 is to leave it at the default, where a lowered value can cause looping and degraded output.<\/li>\n<li>Fix: Anthropic Claude requests no longer send a fixed temperature, so the model runs at its own default.<\/li>\n<li>Fix: The one-time migration of older error placeholders runs in small batches, so a library with thousands of failed images cannot time out an admin page load, and it only converts text matching exactly what the plugin wrote \u2014 a Description of your own that happens to begin with the same words is left alone.<\/li>\n<li>Hardening: Image reads now verify that WordPress filesystem access initialized successfully before use.<\/li>\n<li>Cleanup: Uninstall now removes plugin-private feedback\/data-version options and private processing\/error meta while preserving generated SEO content.<\/li>\n<li>Packaging: Removed an accidental duplicate copy of the plugin that had been nested under <code>\/assets\/<\/code>.<\/li>\n<li>Documentation: Added explicit External Services disclosures for Google, OpenAI, Anthropic, DeepSeek, and the optional feedback email.<\/li>\n<li>Fix: Feedback sent from the Help &amp; Rate Us page was reported as delivered even when the site could not send email at all \u2014 so the message was silently lost while you were thanked for it. The plugin now checks whether the mail actually went out, keeps what you typed if it did not, and points you to the support forum instead.<\/li>\n<li>Fix: The star rating no longer reappears every time you open the Help page after you have already rated or left a review. A \"Send more feedback\" button is there if you want to write again.<\/li>\n<li>Improvement: The Help &amp; Rate Us page now actually contains help \u2014 the common causes of images not being tagged, and what to include when asking on the support forum.<\/li>\n<li>Improvement: Feedback emails now include the site address, plugin version and chosen AI provider, so a report can be acted on without a round of questions. API keys are never included.<\/li>\n<li>New: Images are now downscaled before being sent to the AI. WordPress has already made smaller copies of every upload, so in most cases the plugin simply uses the existing 1024px \"large\" version instead of the full-size original \u2014 an 8MB photo becomes a 150KB upload. The AI providers downscale large images anyway, so the descriptions are unchanged; uploads are far faster and, on the higher-resolution models, noticeably cheaper.<\/li>\n<li>New: If your setup has no suitable copy \u2014 an optimization plugin that switches off the larger registered sizes, or a big upload whose thumbnails never got built \u2014 the plugin now creates a temporary resized copy for the AI and deletes it straight afterwards. Your original file is never modified.<\/li>\n<li>New: Images in formats the AI cannot read (AVIF, BMP, TIFF) are converted to JPEG for that temporary copy, so they get proper alt text instead of being skipped.<\/li>\n<li>Fix: The plugin will no longer describe a tiny thumbnail. If the only remaining copy is smaller than 512px it resizes the original instead, because descriptions written from a 150px image are vague and often wrong.<\/li>\n<li>New: AI Model selector \u2014 you now choose which model runs, instead of the plugin picking for you. Models are listed cheapest first.<\/li>\n<li>Fix: A busy model no longer silently switches you to a more expensive one. The plugin now waits a few seconds and retries the same model, which clears most rate limits; only if you switch on \"If the model is busy\" will it move up to a pricier model. Previously a rate-limited Haiku would escalate all the way to Opus \u2014 roughly 7x the cost per image \u2014 with nothing to warn you.<\/li>\n<li>Fix: Auto-discovered Google Gemini models are now sorted cheapest-first. Google returns its catalogue in its own order, so a costly Pro model could previously end up as the default for a new install.<\/li>\n<li>Fix: Large images are no longer sent to a provider that cannot accept them. The size limit is now calculated per provider against the encoded payload, which is roughly a third larger than the file on disk \u2014 previously images between about 7.5MB and 10MB were accepted locally and then rejected by Anthropic Claude.<\/li>\n<li>Fix: Images in formats the AI providers cannot read (AVIF, BMP, TIFF, SVG) are now caught before upload with a clear message naming the supported formats, instead of failing with an opaque provider error. HEIC\/HEIF is allowed through on Google Gemini, which supports it.<\/li>\n<li>Fix: A file whose type could not be identified is no longer sent to the AI labelled as a JPEG. Guessing moved the failure to the API, where the reported error was much harder to act on.<\/li>\n<li>Improvement: Oversized and unsupported images now fall back to filename-based text rather than leaving the attachment with no alt text at all.<\/li>\n<li>Improvement: DeepSeek requests automatically retry as plain text if strict JSON output is rejected or comes back empty, so a JSON-mode limitation never costs you a generated tag.<\/li>\n<li>Improvement: DeepSeek key verification performs a real generation check, so a key with an exhausted balance is reported upfront instead of silently falling back to filename mode.<\/li>\n<li>Security: Removed API keys from localized scripts and rendered settings; added explicit key removal and a secure masked saved-key state without rendering the secret.<\/li>\n<li>Security: Corrected rename and banner nonces, per-attachment authorization, provider error redaction and text-only UI notices.<\/li>\n<li>Data safety: Replaced destructive renames and global SQL URL replacement with verified copies; preserved GUIDs, serialized data and published URLs.<\/li>\n<li>Fix: Bulk runs use an increasing attachment-ID cursor and continue beyond failed 100-image batches.<\/li>\n<li>Fix: Atomic per-image locks cover automatic processing, manual regeneration and renaming; an expired owner cannot release another request's lock.<\/li>\n<li>Fix: Upload readiness is finalized at request shutdown after WordPress image metadata generation.<\/li>\n<li>Fix: All field-toggle combinations behave consistently; disabled fields are preserved, no-op runs stay pending, and rename-only runs request a filename.<\/li>\n<li>Fix: Rejected incomplete, empty, malformed and refused AI responses; failures preserve existing metadata and remain retryable.<\/li>\n<li>Fix: Preserved settings on verification failure, avoided double unslashing, blocked duplicate saves and retained edits typed during an in-flight save.<\/li>\n<li>Fix: Bounded provider requests, respected numeric\/date Retry-After, avoided retrying transport timeouts, and paginated Gemini\/Claude model discovery.<\/li>\n<li>Fix: Queues include WordPress image types that require local conversion; cropped thumbnails are excluded from AI inputs.<\/li>\n<li>Fix: Checked database\/file errors, kept source image bytes, made repeated renames idempotent, and added PHP-memory and actual-image-type validation.<\/li>\n<li>Fix: Failed filename changes remain retryable; manual Rename reuses the saved AI filename without another generation charge.<\/li>\n<li>Fix: Regenerating media no longer reloads editors and discards unsaved post content.<\/li>\n<li>Fix: Repaired the Settings plugin action link, removed inline JavaScript, restored styled selects with keyboard\/ARIA accessibility, and offered public reviews for every rating.<\/li>\n<li>Cleanup: Added deactivation job cleanup and multisite-aware uninstall while preserving media, processed-status\/rename history and backup URLs so reinstalling does not re-queue already optimized images.<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Fix: Retired or deprecated Gemini models (e.g. gemini-2.5-flash) now automatically fall back to the next available model instead of stopping with an \"AI Error\".<\/li>\n<li>Fix: Fallback mechanism added for \"JSON mode not supported\" errors \u2014 the plugin now automatically retries the model as plain text if application\/json mimeType fails.<\/li>\n<li>Fix: Resolved Regenerate Button silently failing by clearing stale transients before execution and accurately reporting API errors back to the user.<\/li>\n<li>Fix: Corrected the spinning animation CSS logic and vertical flexbox alignment for all buttons to ensure icons and text are perfectly centered without wobbling.<\/li>\n<li>New: Media Grid Modal integration \u2014 the \"Auto-Generate AI Tags\" button now correctly appears inside the Backbone JS attachment modal.<\/li>\n<li>New: Added full tooltip on hover for truncated errors in the Bulk Optimizer table.<\/li>\n<li>Improvement: Model discovery regex is now future-proof \u2014 new Gemini versions (3.5, 3.6, 4.0, etc.) are auto-discovered without requiring a plugin update.<\/li>\n<li>Improvement: Prefixed API errors with \"AI Provider Error:\" to clarify when the error comes from the AI provider (e.g., rate limits) vs the plugin itself.<\/li>\n<li>Improvement: Replaced file_get_contents() with WP_Filesystem for stricter WordPress coding standards compliance.<\/li>\n<li>Improvement: Added 'Reply-To' header to the user feedback form to prevent support emails from going to spam.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Improvement: Custom Prompt Context is now treated as high-priority instructions the AI must follow, so your brand name, tone, or focus is reliably reflected in the generated Alt Text and other fields.<\/li>\n<li>Improvement: Alt Text is now grounded strictly in what is visible in the image \u2014 the AI is instructed not to invent brands, names, or details it cannot see, producing more accurate results.<\/li>\n<li>Improvement: Default Alt Text length is now \"Medium (5-15 words)\" instead of \"Short\", giving more descriptive, SEO-friendly alt text out of the box (existing saved settings are unchanged).<\/li>\n<li>Improvement: Lower generation temperature for OpenAI and Claude keeps descriptions faithful to the image instead of overly \"creative\".<\/li>\n<li>Fix: Gemini responses are now requested as strict JSON, reducing occasional \"Invalid JSON\" failures that left an image without generated tags.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: Multi-provider support \u2014 choose Google Gemini, OpenAI (GPT-4o), or Anthropic Claude as your image analysis engine, each with its own API key.<\/li>\n<li>New: AI Provider selector in Settings, with per-provider key validation and \"get your key\" links.<\/li>\n<li>Improvement: Per-provider model fallback \u2014 if one model is rate-limited, the plugin automatically tries the next.<\/li>\n<li>Improvement: New uploads are now auto-tagged within seconds while you stay on the page, instead of waiting for a WordPress cron page reload. The upload request no longer performs any AI work, so uploads are noticeably faster.<\/li>\n<li>Improvement: Clearer verification errors \u2014 the plugin now tells you the real reason a key was rejected (e.g. an invalid key vs. a server SSL\/network problem vs. Google Gemini being unavailable in your region), instead of always saying \"Invalid API Key\".<\/li>\n<li>Fix: Added a concurrency lock so a single image is never processed (and billed) twice when the background processor and cron fallback overlap.<\/li>\n<li>Fix: A key that fails verification is no longer saved \u2014 the field is cleared so it can't get stuck showing a non-working key.<\/li>\n<li>Fix: Switching the AI Provider now clears the key field so a previous provider's key never carries over.<\/li>\n<li>Fix: OpenAI\/Claude key verification now performs a real generation check, so a key with no credits\/quota is caught upfront (with an \"add billing\/credits\" message) instead of appearing active and silently falling back to filename mode.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>New: Multilingual output \u2014 generated text now matches your site language automatically (Auto-detect), with a manual picker for 30+ languages.<\/li>\n<li>Fix: The \"Custom Prompt Context\" advanced setting is now actually sent to the AI (it was previously saved but ignored).<\/li>\n<li>Improvement: Saving settings no longer re-verifies the API key on every save. It only re-checks when the key changes, so a brief network hiccup can no longer silently revert a working AI configuration to fallback mode.<\/li>\n<li>Hardening: Added a capability check to the feedback handler and a guard against corrupted model data.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Minor bug fixes and complete rebranding implementation.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial Release.<\/li>\n<li>Added Google Gemini Vision integration.<\/li>\n<li>Added Physical file renaming with thumbnail support.<\/li>\n<li>Added Auto-Fallback model routing.<\/li>\n<li>Added Bulk AJAX processing.<\/li>\n<\/ul>","raw_excerpt":"Auto-generate SEO-optimized Alt Text, Titles, Captions and rename image files using Google Gemini, OpenAI, Anthropic Claude, or DeepSeek AI.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/285783","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=285783"}],"author":[{"embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/abdulkabeerdeveloper2530"}],"wp:attachment":[{"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=285783"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=285783"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=285783"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=285783"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=285783"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/tw.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=285783"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}