# AI Description Updater for Magento 2  -  module reference

> Generate Magento 2 product descriptions with OpenAI, Claude, Gemini or free Groq. Dry run, store views, Google Sheets, cron, CLI and safety notes.

Source: https://angeo.dev/docs/modules/ai-description-updater/
Updated: 2026-10-17

Module reference

# AI Description Updater for Magento 2  -  module reference

Covers `angeo/module-ai-description-updater` 1.1.1 - Checked 16 October 2026 - MIT licensed

**AI Description Updater** writes product descriptions for your Magento 2 catalog with an AI model. It can also write the short description, meta title, meta description and meta keywords. It works across all store views and languages.

You choose the provider: OpenAI, Anthropic Claude, Google Gemini, or Groq (free, no credit card). You run it from the command line, from cron, or from the admin panel. A **dry run** mode lets you see the result before anything is saved.

Package`angeo/module-ai-description-updater`Latest version1.1.1 (released 2026-09-16)Magento2.4.6+PHP8.1 - 8.5LicenseMIT, freeLinks[GitHub](https://github.com/angeo-dev/module-ai-description-updater) - [Packagist](https://packagist.org/packages/angeo/module-ai-description-updater) - [Changelog](https://github.com/angeo-dev/module-ai-description-updater/blob/main/CHANGELOG.md) - [Module page](https://angeo.dev/modules/ai-description-updater/)

**On this page**

1. What it does
2. Requirements
3. Installation
4. Quick start with Groq (free)
5. Command line
6. How it handles store views
7. Prompts
8. Batches and cost
9. Google Sheets
10. Safety
11. Configuration reference
12. Cron
13. FAQ
14. Related

## What it does

- Generates text for `description`, `short_description`, `meta_title`, `meta_description` and `meta_keyword`  -  you choose which.
- Runs per store view, in that store view's scope and language.
- Takes SKUs from the catalog or from a Google Sheet.
- Writes a CSV report and, if you want, a Google Sheet with the results.
- Processes a fixed batch per run and remembers where it stopped, so costs stay predictable.

## Requirements

| Magento | 2.4.6+ (Open Source, Mage-OS or Adobe Commerce)  -  `magento/framework >=103.0.6 <104` |
| PHP | 8.1 - 8.5  -  `~8.1.0||~8.2.0||~8.3.0||~8.4.0||~8.5.0` |

You also need an API key for one provider. Groq has a free tier: 30 requests a minute and 14,400 a day.

## Installation

```
composer require angeo/module-ai-description-updater
bin/magento module:enable Angeo_AiDescriptionUpdater
bin/magento setup:upgrade
bin/magento setup:di:compile                # production mode only
bin/magento cache:flush
```

## Quick start with Groq (free)

1. Create a free account at [console.groq.com](https://console.groq.com) and make an API key. It starts with `gsk_`.
2. Go to **Stores -> Configuration -> Angeo AEO -> AI Description Updater**.
3. Set **General -> Enable Module** to *Yes* and keep **Dry Run Mode** on *Yes*.
4. Set **AI Provider** to *Groq*, paste the key, and choose *Llama 3.3 70B Versatile*.
5. Under **Attributes to Generate**, set **Generate Description** to *Yes*. Save.
6. Test without saving anything:

```
bin/magento angeo:ai-description:run --dry-run
```

1. Read the result in `var/log/angeo_ai_description_updater.log`.
2. Turn dry run off and try one product first:

```
bin/magento angeo:ai-description:run --sku=YOUR-TEST-SKU
```

1. Check the product in the admin. If it looks good, run the full batch without `--sku`.

## Command line

```
bin/magento angeo:ai-description:run                      # all active store views
bin/magento angeo:ai-description:run --sku=MY-SKU-001     # one SKU in all stores
bin/magento angeo:ai-description:run --store=2            # one store view
bin/magento angeo:ai-description:run --dry-run            # generate, do not save
```

| Option | Meaning |

| `--sku` | Process one SKU only. Ignores the batch size. |
| `--store` | Process one store id. Default: every active store view. |
| `--dry-run` | Generate but do not save. Overrides the setting. |

## How it handles store views

Without `--store`, the module walks through every active store view one by one. For each one it loads the product in that scope, reads that store view's prompt and language settings, replaces `{{store_name}}` with the store view name, and saves the text in that store view's scope  -  not in the global default.

So you can set a Dutch prompt on the Dutch store view and an English prompt on the English one, and both are used.

## Prompts

The prompt template supports `{{product_name}}`, `{{product_sku}}` and `{{store_name}}`. For example:

```
Write a professional and SEO-friendly product description for "{{product_name}}"
(SKU: {{product_sku}}) for our {{store_name}} online store.
Include key benefits, features, and use cases.
Format using HTML paragraphs. Keep it between 150 and 250 words.
```

Set the language per store view under **Prompt Configuration -> Language**.

## Batches and cost

Each run handles at most **Batch Size** SKUs per store view (50 by default). The module stores an offset in `var/angeo/ai_description_updater/offset_store_<id>.txt`, so the next run continues where the last one stopped. When it reaches the end of the catalog, it starts again. To reset one store view, delete its offset file.

## Google Sheets

**As a SKU source.** Put SKUs in one column of a sheet. Share the sheet as *Anyone with the link can view*. Enter the spreadsheet ID, the tab GID and the column index (0 = column A). No service account is needed.

**As an export.** Create a Google Cloud project, enable the *Google Sheets API*, create a service account and download its JSON key. Share the target sheet with the service account's `client_email` as Editor. Paste the full JSON into **Google Sheets Export -> Service Account JSON**. The key is stored encrypted. A dry run does not export.

## Safety

The module treats AI output and outside data as untrusted:

- HTML for the `description` field goes through an allow-list sanitizer. `<script>`, event handlers and `javascript:` links are removed.
- CSV cells that start with `=`, `+`, `-` or `@` are escaped. The Sheets export uses `RAW` input, so nothing runs as a formula.
- The Sheets download only goes to `docs.google.com` over HTTPS.
- The CSV file name is reduced to a safe name, with no path parts.
- Admin actions are POST only, so Magento checks the form key.
- API keys and the service account JSON are stored encrypted and never logged.

## Configuration reference

All settings are under **Stores -> Configuration -> Angeo AEO -> AI Description Updater**. The table shows each field, its config path (for `bin/magento config:set`) and its default value.

General Settings (4)

| Setting | Config path | Default |

| Enable Module | `angeo_ai_description/general/enabled` | No |
| Dry Run Mode | `angeo_ai_description/general/dry_run` | Yes |
| Enable Detailed Logging | `angeo_ai_description/general/log_enabled` | Yes |
| Batch Size | `angeo_ai_description/general/batch_size` | `50` |

AI Provider (1)

| Setting | Config path | Default |

| AI Provider | `angeo_ai_description/ai_provider/provider` | `openai` |

OpenAI (ChatGPT) Settings (5)

| Setting | Config path | Default |

| OpenAI API Key | `angeo_ai_description/openai/api_key` |  -  (stored encrypted) |
| GPT Model | `angeo_ai_description/openai/model` | `gpt-4.1` |
| Temperature | `angeo_ai_description/openai/temperature` | `0.7` |
| Max Tokens | `angeo_ai_description/openai/max_tokens` | `800` |
| Request Timeout (s) | `angeo_ai_description/openai/timeout` | `30` |

Anthropic (Claude) Settings (6)

| Setting | Config path | Default |

| Claude API Key | `angeo_ai_description/claude/api_key` |  -  (stored encrypted) |
| Claude Model | `angeo_ai_description/claude/model` | `claude-sonnet-4-6` |
| Max Output Tokens | `angeo_ai_description/claude/max_tokens` | `1024` |
| Request Timeout (s) | `angeo_ai_description/claude/timeout` | `60` |
| Enable Extended Thinking | `angeo_ai_description/claude/extended_thinking` | No |
| Thinking Token Budget | `angeo_ai_description/claude/thinking_budget` | `2048` |

Google (Gemini) Settings (5)

| Setting | Config path | Default |

| Gemini API Key | `angeo_ai_description/gemini/api_key` |  -  (stored encrypted) |
| Gemini Model | `angeo_ai_description/gemini/model` | `gemini-2.5-flash-preview-05-20` |
| Temperature | `angeo_ai_description/gemini/temperature` | `0.7` |
| Max Output Tokens | `angeo_ai_description/gemini/max_tokens` | `1024` |
| Request Timeout (s) | `angeo_ai_description/gemini/timeout` | `30` |

Groq Settings (Free) (5)

| Setting | Config path | Default |

| Groq API Key | `angeo_ai_description/groq/api_key` |  -  (stored encrypted) |
| Model | `angeo_ai_description/groq/model` | `llama-3.3-70b-versatile` |
| Temperature | `angeo_ai_description/groq/temperature` | `0.7` |
| Max Output Tokens | `angeo_ai_description/groq/max_tokens` | `1024` |
| Request Timeout (s) | `angeo_ai_description/groq/timeout` | `30` |

Prompt Configuration (4)

| Setting | Config path | Default |

| System Role | `angeo_ai_description/prompt/system_role` | `You are a professional product copywriter specialising in e-commerce.` |
| Prompt Template (global fallback) | `angeo_ai_description/prompt/prompt_template` | `Write a professional and SEO-friendly product description for "{{product_name}}"` |
| Description Language | `angeo_ai_description/prompt/language` | `en` |
| Include SEO Keywords | `angeo_ai_description/prompt/include_seo` | Yes |

Attributes to Generate (11)

| Setting | Config path | Default |

| Generate Description (HTML) | `angeo_ai_description/attributes/description_enabled` | Yes |
| Description  -  Custom Prompt | `angeo_ai_description/attributes/description_prompt` |  -  |
| Generate Short Description (plain text) | `angeo_ai_description/attributes/short_description_enabled` | Yes |
| Short Description  -  Custom Prompt | `angeo_ai_description/attributes/short_description_prompt` |  -  |
| Short Description Max Length (chars) | `angeo_ai_description/attributes/short_description_length` | `150` |
| Generate Meta Title | `angeo_ai_description/attributes/meta_title_enabled` | No |
| Meta Title  -  Custom Prompt | `angeo_ai_description/attributes/meta_title_prompt` |  -  |
| Generate Meta Keywords | `angeo_ai_description/attributes/meta_keyword_enabled` | No |
| Meta Keywords  -  Custom Prompt | `angeo_ai_description/attributes/meta_keyword_prompt` |  -  |
| Generate Meta Description | `angeo_ai_description/attributes/meta_description_enabled` | No |
| Meta Description  -  Custom Prompt | `angeo_ai_description/attributes/meta_description_prompt` |  -  |

Google Sheets Source (4)

| Setting | Config path | Default |

| Enable Google Sheets Source | `angeo_ai_description/google_sheets/enabled` | No |
| Spreadsheet ID | `angeo_ai_description/google_sheets/spreadsheet_id` |  -  |
| Sheet GID | `angeo_ai_description/google_sheets/gid` | `0` |
| SKU Column Index (0-based) | `angeo_ai_description/google_sheets/sku_column_index` | `0` |

Export / Output (3)

| Setting | Config path | Default |

| Save CSV Report | `angeo_ai_description/export/csv_enabled` | Yes |
| CSV Filename Pattern | `angeo_ai_description/export/csv_filename` | `ai_descriptions_{{date}}.csv` |
| Notification Email | `angeo_ai_description/export/notify_email` |  -  |

Google Sheets Export (5)

| Setting | Config path | Default |

| Enable Google Sheets Export | `angeo_ai_description/google_drive/enabled` | No |
| Service Account JSON | `angeo_ai_description/google_drive/service_account_json` |  -  (stored encrypted) |
| Spreadsheet ID | `angeo_ai_description/google_drive/spreadsheet_id` |  -  |
| Sheet Tab Name | `angeo_ai_description/google_drive/sheet_name` | `Sheet1` |
| Clear Sheet Before Write | `angeo_ai_description/google_drive/overwrite_existing` | No |

Cron Schedule (2)

| Setting | Config path | Default |

| Enable Cron | `angeo_ai_description/cron/enabled` | No |
| Cron Expression | `angeo_ai_description/cron/schedule` | `0 2 * * *` |

## Cron

Cron is off by default. When you turn it on, it runs daily at 02:00 unless you set another schedule.

| Job | Cron group | Schedule |

| `angeo_ai_description_updater` | `default` | `0 2 * * *` by default, set in `angeo_ai_description/cron/schedule` |

## FAQ

### Which provider should I start with?

Start with Groq. It is free and needs no credit card. Move to OpenAI, Claude or Gemini later if you want different quality or style.

### Can I check the text before it is saved?

Yes. Keep Dry Run Mode on, or use `--dry-run`. The text goes to the log file only. Then test one SKU with `--sku` before a full run.

### Does it overwrite descriptions in all store views?

It saves each text in the scope of the store view it was written for. Use `--store` to limit a run to one store view.

### How do I control the cost?

Use Batch Size. Each run processes at most that many SKUs per store view and then stops. The next run continues from the saved offset.

### Is generated HTML safe to show on the storefront?

The description is cleaned with an allow-list sanitizer before saving. Scripts, event handlers and `javascript:` links are removed. Still read a sample of the output before you publish at scale.

## Related

- [llms.txt](https://angeo.dev/docs/modules/llms-txt/)  -  generate llms.txt, llms.jsonl, Markdown mirrors and agents.md
- [Rich Data](https://angeo.dev/docs/modules/rich-data/)  -  one linked JSON-LD graph per page, with offers and policies
- [AEO Audit](https://angeo.dev/docs/modules/aeo-audit/)  -  score 20 AI-visibility signals from the command line
- [All module reference pages](https://angeo.dev/docs/modules/) - [Compatibility matrix](https://angeo.dev/docs/compatibility/)

This page was written from the `README.md`, `composer.json` and `etc/*.xml` files of [tag 1.1.1](https://github.com/angeo-dev/module-ai-description-updater/tree/1.1.1), read on 16 October 2026. Settings, commands and defaults come straight from that code. If a newer release is out, the README on GitHub wins.
