# product-describer

AI product-copy microservice for e-commerce catalogs, marketplaces and PDP pages. describe turns a product's attributes ({ name, brand, category, material, color, features, audience, ... }) into a...


**AI product-copy microservice** for e-commerce catalogs, marketplaces and PDP pages. Feed it a
product's **attributes** and it returns listing-ready copy: a marketing paragraph, benefit bullets, a
spec table, an SEO title, a meta description, per-variant copy and inferred care instructions.

Every tool has a deterministic heuristic-template core that runs fully **offline**. The generative
tools (`describe`, `bullets`, `variantsCopy`) also wire an optional LLM path that enriches when a model
is reachable and silently falls back — those results carry `{ mode: 'heuristic' | 'llm' }`.

## Tools

| Tool | Input | What it does |
|---|---|---|
| `describe` | `attributes` | Turns attributes into a persuasive marketing paragraph (tone + length controlled). |
| `bullets` | `features` | Converts raw features into benefit-led selling bullets (feature → so-you-can benefit). |
| `specsTable` | `attributes` | Renders attributes into a spec table: `rows` + `markdown` + `html`. |
| `seoTitle` | `attributes` | Builds an SEO-optimized, length-capped product title. |
| `metaDescription` | `attributes` | Writes a click-worthy meta description under 160 chars (configurable). |
| `variantsCopy` | `variants` (+ `attributes`) | Produces per-variant copy for size/color/option combos. |
| `careInstructions` | `attributes` | Infers wash/care/maintenance guidance from material + category. |

## Usage

```js
import pack from './index.js';

await pack.adapters.describe({
  attributes: { name: 'Trailblazer Backpack', brand: 'Summit', category: 'daypack',
    material: 'ripstop nylon', color: 'forest green', features: ['waterproof', 'lightweight', 'adjustable straps'] },
  options: { tone: 'bold', length: 'medium' },
});

pack.adapters.bullets({ features: ['waterproof zippers', 'padded laptop sleeve', 'lightweight frame'] });

pack.adapters.careInstructions({ attributes: { material: 'wool', category: 'apparel' } });
```

Each tool takes ONE args object (maps 1:1 to an HTTP POST body). Invalid input throws `TypeError`.

## Options

`options`: `tone` (bold/friendly/professional/playful/luxury), `length` (short/medium/long),
`maxLength` (title/meta cap), `format` (markdown/html/rows for `specsTable`), `keywords`,
`narrate` (force-try the LLM path).

## DRY boundaries

- This GENERATES **product-listing copy from attributes**.
- It is NOT the general conversion-copywriter (`copywriter`), the meta/HTML auditor (`seo`), or the
  keyword tool (`keyword-cluster`).
- Self-contained: no cross-pack imports except `../_shared/llm.js`.


---
Source: shared/engines/adapters/domain/product-describer/README.md
Canonical: https://docs.leumas.tech/p/adapters/domain/product-describer
