AI profiles
A profile is one standing instruction: "write my product titles the way Google Shopping wants them." You set it up once, and it keeps applying itself - to today's catalog, and to every product you add next year.
That is the whole idea. You are not generating text; you are hiring something to keep generating it.
Profiles live at Catalog → Advanced Product Feeds → AI optimization.
The profile library
The grid lists every profile you have created.
| Column | Description |
|---|---|
| ID | Internal identifier. |
| Name | The profile's display name. |
| Code | The short code a feed uses to reference the profile as ai:<code>. |
| Attribute | The attribute this profile writes into. |
| Kind | Text rewrite, Attribute enrichment or Category mapping. |
| Coverage | How many products already have a current value out of the products in scope. Shows Waiting when the profile has no active products in scope, and a n failed note when some products could not be generated. |
| Last run | Hidden by default; enable it in the Columns control. Shows Never ran, a Failed badge with the reason, or the last run's totals. |
| Status | Whether the profile is enabled. Only enabled profiles are picked up by the background process. |
Row actions are Edit, Results, Duplicate and Delete. Duplicating a profile copies its settings and feed assignments under the name Copy of <name>.
Creating a profile
- Click Add New Profile.
- On the What should this profile do? step, choose a shipped preset or Blank profile.
- Click Continue.
Nothing is created on the chooser step. The preset only prefills the form on the next screen, and the profile exists once you save it.
Shipped presets
You almost never need to start from a blank page. Four presets ship with the extension, and their prompts are not placeholders - they encode Google's actual published guidance, down to the rules most stores get wrong (use all 150 title characters, not 70; never put price or shipping in a description; leave an attribute empty rather than inventing a value Merchant Center will reject).
Pick the closest one, adjust the wording to your brand, and you are done.
| Preset | What it does | Kind | Target | Defaults |
|---|---|---|---|---|
| Title - Google Shopping | Rewrites the product title for Google Shopping: brand and identifying attributes first, up to Google's full 150 characters. | Text rewrite | name | Character limit 150, replaces the existing value, 10 products per call |
| Description - shopping intent | Expands or rewrites the description for shopping surfaces, in plain text, from the product data only. | Text rewrite | description | Character limit 5000, replaces the existing value, 5 products per call |
| Google category mapping | Infers the Google product category from the store category path. Only products you have not mapped by hand are sent. | Category mapping | mapping:1 | Fills only what is empty |
| Attribute enrichment - color, size, material | Derives color, size and material from everything the catalog knows. Only fills what is empty, and only values your attribute allows. | Attribute enrichment | color, size, material | Fills only what is empty, 20 products per call |
| Blank profile | Start from nothing and write your own instruction. | - | - | - |
The Google category mapping preset ships pointing at mapping:1, which is unlikely to be your own mapping. Open the Category mapping field and select the manual mapping this profile should complete before you enable it.
structured_titleGoogle requires generative-AI text to be submitted in [structured_title] with digital_source_type = trained_algorithmic_media, not in [title]. The extension has no structured_title field yet, so if you use the Title - Google Shopping preset on a Google Shopping feed, either map its output to structured_title yourself in the feed template, or treat the result as a draft you review before it ships.
Profile kinds
There are three jobs a profile can do. The Kind you pick decides which fields the form shows and how the work is paced.
Text rewrite - make one field better
Takes an attribute you already have and rewrites it: a title that reads like a search query, a description without the HTML and the marketing claims marketplaces reject.
Choose the attribute in Target attribute. It honours the Character limit, cutting at a word boundary if the model runs long, so you cannot overshoot Google's 150 and get truncated mid-word.
You can also point it at a name your catalog does not have. In that case the feed reads the result through the ai:<code> token rather than by substitution.
Attribute enrichment - fill what is missing
Derives up to five attributes at once from everything the catalog already knows, declared in Attributes to fill. This is the one that rescues products Merchant Center is demoting for a blank color or material.
Two things make it more useful than it first looks:
- The attributes do not have to exist in Magento. Type
key_featuresand your feed gains a field your catalog has never had - no new product attribute, no schema change, no data migration. - Combined with Only where the value is empty, it fills the gaps and leaves everything a human entered completely alone.
A feed reads each declared output as ai:<code>_<attribute>. The bare ai:<code> form does not exist for an enrichment profile.
Category mapping - finish the boring part
You mapped the top categories by hand and then ran out of patience. This kind finishes the tail: the model gets a shortlist of allowed taxonomy paths and must return one verbatim, or say that none fits. Under Only where the value is empty it looks only at the products your manual mapping left unmapped.
It is also by far the cheapest kind, because it thinks in categories rather than products. Products whose prompt renders identically are grouped, each distinct group is answered once, and the answers are cached across runs. Thousands of products sharing a few hundred category paths cost a few hundred answers.
Character limits and batching mean nothing here, so those fields are hidden.
General information
| Field | Description |
|---|---|
| Is active | Enables the profile. Once enabled, values are generated in the background on cron. |
| Name | The profile's display name. |
| Code | Referenced in a feed as ai:<code>. Lowercase letters, numbers and underscores. |
| Kind | Text rewrite, Attribute enrichment or Category mapping. See above. |
| Attributes to fill | (Attribute enrichment only) Up to 5 attributes. Pick your catalog's attributes, or type a name it does not have. |
| Target attribute | (Text rewrite only) The attribute this profile generates, for example description. |
| Category mapping | (Category mapping only) Which manual category mapping this profile completes. |
| Apply to feeds | Which feeds substitute this profile's value automatically. See below. |
What "Apply to feeds" does
This is the checkbox that saves you an afternoon.
Tick a feed here and, in that feed only, wherever it already uses the profile's target attribute - a CSV column, a {{ product.<attribute> }} reference - the generated value quietly takes the place of the catalog one. You do not edit the feed at all. A feed built from the Google Shopping template keeps its {{ product.name }}; assigning a title profile just changes what that resolves to.
Products the profile has not reached yet keep the catalog value, so it is perfectly safe to tick the box before the profile has finished running.
The attribute code is matched whole, so a profile targeting color never substitutes {{ product.color:swatch }}.
Two limits are worth knowing:
- Only one active profile per attribute is allowed on a given feed. Assigning a second one is refused at save.
- For an enrichment profile, assignment substitutes the target attribute only. Its other declared outputs reach a feed through their own
ai:<code>_<attribute>token, never through assignment.
Leaving Apply to feeds empty is perfectly normal: the profile still runs across every active store view, and any feed can read it by token. See Using AI values in a feed.
Instruction
| Field | Description |
|---|---|
| Prompt | The instruction sent to the model. It interpolates product attributes exactly the way a feed column does, so {{ product.name }}, {{ product.category.path }} and {{ product.attribute_set }} all work here. |
| AI provider | Leave on -- Use default provider -- to use the provider configured in Mirasvit Core, or pick a specific one for this profile. |
| AI model | Leave on -- Use default model --, or pick a specific model for this profile. |
Passing the product data
Here is the single most useful thing on this page: {{ product.all_attributes }}.
It renders every attribute this store actually holds a value for, as Label: value lines, with select values as their option text. Use it and you never have to know what your catalog calls things.
That matters more than it sounds. Hard-coding codes in a prompt is guesswork - color exists in some catalogs and is colour or attr_142 in others, and a {{ product.material }} that resolves to nothing fails silently. The prompt looks complete while the model works blind and produces confident nonsense. all_attributes cannot fail that way.
- The default budget is 3000 characters. Set your own with
{{ product.all_attributes:1500 }}. - Each single value is cut at 400 characters, so one long description cannot swallow the whole budget.
- Price, cost and stock are deliberately excluded. A value is regenerated when the digest of its rendered prompt changes, so including a price would re-bill your whole catalog every time one moved.
This budget is the main lever on what the feature costs. A title needs the attributes that identify a product, not the marketing copy at the tail of it, so a tighter budget is usually both cheaper and better.
Advanced
This section is collapsed by default - every field in it has a working default.
| Field | Description |
|---|---|
| Fill mode | Only where the value is empty leaves values you entered by hand alone. Replace the existing value regenerates them all. |
| Character limit | Cut at a word boundary if the model overshoots. Google Shopping accepts titles up to 150 characters and descriptions up to 5000. Hidden for category mapping. |
| Output language | Defaults to Each store view's own language. Set it explicitly only when the feed's language differs from the store view's - an English catalog feeding a French marketplace. |
| Approve mode | Auto publishes generated values immediately. Manual holds them for approval, and your feeds keep serving the previous value until you approve the new one. See Results and approval. |
| Send products in batches | On by default. Several products per model call, which is far cheaper. Turn it off for a prompt that only works one product at a time. |
| Products per call | Defaults to 10 for a rewrite and 20 for enrichment. Leave empty for the default; at most 100. |
A batch size above 100 is refused at save rather than silently clamped, because a stored 500 that runs as 100 misdescribes the profile. If a batch fails, the extension splits it to isolate the product that caused the failure, so one awkward product does not lose the whole batch.
Preview
Preview is the feature that makes the rest of this safe to use. It runs the real pipeline against real products from your own catalog and shows you the result side by side - and stores absolutely nothing.
In the preview panel choose:
- Store view - defaults to Store view of the assigned feeds.
- Products - 5, 10 or 20.
- Product IDs - leave empty for a random sample, or name specific products.
Then click Generate preview. The table shows Product, Original and Optimized, and the footer reports how many tokens the preview cost. For a grouped kind it also reports how many products needed a model call and how many reused an answer.
Nothing is written to storage, no run is recorded, and the cache is untouched. Preview as often as you like while you tune the wording - you pay only for the tokens the sample costs.
A prompt fixed across 20 previewed products costs you 20 products. The same prompt fixed after it has run across 20,000 costs you 20,000 - twice, because they all have to be regenerated. Preview until you are happy, then enable. It is the whole trick.
The coverage bar
Once a profile is saved, a coverage bar appears above the form.
- Covered - products with a current value, out of the enabled products in scope.
- Pending - products still waiting, with an estimate of how long they will take at the current pace.
- Failed - shown only when something failed. Failed items are retried after fresh work, not before it.
- Awaiting approval - shown under manual approve mode; your feeds still use the previous values for these.
- Tokens used - total tokens this profile has spent, with a projection of how many more it needs to finish, based on this profile's own average.
Below the stats, How feeds read this profile spells out both routes for this specific profile: which feeds it is assigned to and which attribute it substitutes there, and the literal {{ product.ai:<token> }} strings any feed can use.
Saving changes to a running profile
Editing anything that affects the output - the prompt, the kind, the target, the fill mode, the character limit - invalidates every value the profile has already generated. When that happens on a profile with stored values, saving asks you to confirm:
This change affects the generated output and will require regenerating n stored value(s) for this profile. Regenerating them is estimated at about n tokens, based on this profile's own average. Continue?
The estimate uses the profile's own measured average, so it is only available once the profile has actually run.
When a change is not detected
Regeneration is triggered by a change in the rendered prompt or in the profile's settings. A change that never touches the product row - renaming a category, editing a dynamic attribute the prompt uses - is not noticed. Use Clear Values on the results screen to force a full regeneration in that case.