{
  "schema": "leumas.docs.page/1",
  "id": "adapter:domain/product-describer",
  "slug": "adapters/domain/product-describer",
  "kind": "capabilities",
  "bucket": "package",
  "title": "product-describer",
  "name": "Product Describer",
  "eyebrow": null,
  "chip": null,
  "summary": "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...",
  "keywords": [
    "product-describer",
    "product-copy",
    "marketplaces",
    "so-you-can",
    "specstable",
    "seotitle",
    "seo-optimized",
    "length-capped"
  ],
  "audience": "both",
  "funnel": {
    "product": null,
    "cta": null
  },
  "body": "# product-describer\n\n**AI product-copy microservice** for e-commerce catalogs, marketplaces and PDP pages. Feed it a\nproduct's **attributes** and it returns listing-ready copy: a marketing paragraph, benefit bullets, a\nspec table, an SEO title, a meta description, per-variant copy and inferred care instructions.\n\nEvery tool has a deterministic heuristic-template core that runs fully **offline**. The generative\ntools (`describe`, `bullets`, `variantsCopy`) also wire an optional LLM path that enriches when a model\nis reachable and silently falls back — those results carry `{ mode: 'heuristic' | 'llm' }`.\n\n## Tools\n\n| Tool | Input | What it does |\n|---|---|---|\n| `describe` | `attributes` | Turns attributes into a persuasive marketing paragraph (tone + length controlled). |\n| `bullets` | `features` | Converts raw features into benefit-led selling bullets (feature → so-you-can benefit). |\n| `specsTable` | `attributes` | Renders attributes into a spec table: `rows` + `markdown` + `html`. |\n| `seoTitle` | `attributes` | Builds an SEO-optimized, length-capped product title. |\n| `metaDescription` | `attributes` | Writes a click-worthy meta description under 160 chars (configurable). |\n| `variantsCopy` | `variants` (+ `attributes`) | Produces per-variant copy for size/color/option combos. |\n| `careInstructions` | `attributes` | Infers wash/care/maintenance guidance from material + category. |\n\n## Usage\n\n```js\nimport pack from './index.js';\n\nawait pack.adapters.describe({\n  attributes: { name: 'Trailblazer Backpack', brand: 'Summit', category: 'daypack',\n    material: 'ripstop nylon', color: 'forest green', features: ['waterproof', 'lightweight', 'adjustable straps'] },\n  options: { tone: 'bold', length: 'medium' },\n});\n\npack.adapters.bullets({ features: ['waterproof zippers', 'padded laptop sleeve', 'lightweight frame'] });\n\npack.adapters.careInstructions({ attributes: { material: 'wool', category: 'apparel' } });\n```\n\nEach tool takes ONE args object (maps 1:1 to an HTTP POST body). Invalid input throws `TypeError`.\n\n## Options\n\n`options`: `tone` (bold/friendly/professional/playful/luxury), `length` (short/medium/long),\n`maxLength` (title/meta cap), `format` (markdown/html/rows for `specsTable`), `keywords`,\n`narrate` (force-try the LLM path).\n\n## DRY boundaries\n\n- This GENERATES **product-listing copy from attributes**.\n- It is NOT the general conversion-copywriter (`copywriter`), the meta/HTML auditor (`seo`), or the\n  keyword tool (`keyword-cluster`).\n- Self-contained: no cross-pack imports except `../_shared/llm.js`.\n",
  "source": {
    "path": "shared/engines/adapters/domain/product-describer/README.md",
    "blobSha": "",
    "commit": "",
    "committedAt": "",
    "provenance": "no-git",
    "bytes": 2785,
    "hash": "a931ae6ac37263e1c98a8dfcf206593d093e2736"
  },
  "urls": {
    "html": "/p/adapters/domain/product-describer",
    "json": "/docs/adapters/domain/product-describer.json",
    "md": "/docs/adapters/domain/product-describer.md"
  },
  "links": {
    "composes": [],
    "usedBy": [],
    "product": [],
    "howTo": [],
    "skills": []
  }
}
