Description Generation
Generate professional, casual, or SEO-optimized product descriptions in any language.
Enrichment uses LLM to generate and enhance product content — descriptions, attributes, and wiki information. It complements Gardener (normalization) and Matcher (product linking) in the Commerce AI pipeline.
Description Generation
Generate professional, casual, or SEO-optimized product descriptions in any language.
Taxonomy Sync
Classify products into the site’s category hierarchy via Brain knowledge graph.
Wiki Enrichment
Research and populate brand pages, technology descriptions, and catalog entries.
Multi-language
Ukrainian-first (canonical) with LLM-powered translation to any target language.
Enrichment tasks use dedicated LLM models configured per-graph in contextunity.project.yaml:
# contextunity.project.yaml — multi-graph manifestrouter: toolkits: - EnrichmentTools graph: enricher: template: "yaml:enricher" config: bilingual: true nodes: - name: "enrich" model: "openai/gpt-5-mini" model_secret_ref: "CU_ROUTER_GENERATION_MODEL_KEY"
writer: template: "yaml:enricher" # Same template, different prompts config: bilingual: true task: "description_generation" nodes: - name: "enrich" model: "openai/gpt-5-mini" model_secret_ref: "CU_ROUTER_GENERATION_MODEL_KEY"The enricher and writer graphs both use the enricher YAML template but with different task configs. Enricher handles NER and attribute extraction; writer handles description generation.
Generate product descriptions via contextunity.router’s LLM pipeline:
# Via MCP toolresult = await enrich_product_description( product_id=42, language="uk", # Ukrainian (canonical) style="professional" # professional | casual | seo)Input context (automatically gathered):
Output: 2-3 paragraphs highlighting key features, technical specs, and benefits.
| Style | Use Case |
|---|---|
professional | Product pages, catalogs — factual, structured |
casual | Blog posts, social media — conversational tone |
seo | Search optimization — keyword-rich, scannable |
The canonical language is Ukrainian (set in project config). Descriptions can be generated in any language — the system uses the project’s get_primary_language() to determine the default.
To generate translations after the canonical description exists:
update_product() to saveProduct.translations JSON fieldTaxonomy sync pushes the site’s category tree to contextunity.brain for knowledge graph operations:
# Sync category taxonomy to Brainpython manage.py taxonomy_sync --domain category
# Sync color taxonomypython manage.py taxonomy_sync --domain colorThe taxonomy tree is also available via MCP:
tree = await get_taxonomy_tree(max_depth=3)# Returns flat list of category nodes with depth and product countsProducts needing enrichment are tracked by status:
| Status | Meaning |
|---|---|
raw | Newly harvested, no enrichment yet |
enriching | Currently being processed |
enriched | All enrichment tasks complete |
# List products pending enrichmentqueue = await list_enrichment_queue(dealer="gorgany", limit=25)
# Check enrichment status for a specific productstatus = await get_enrichment_status(dealer_product_id=12345)# Returns: normalized fields, enrichment metadata, trace_idWiki enrichment populates structured content for brands and technologies:
Wiki content is managed through Wagtail CMS snippets (wiki.Brand, wiki.Technology) and enriched via the wiki_researcher node defined in the project manifest.
| Tool | Tags | Description |
|---|---|---|
enrich_product_description | enrichment, mutate | Generate product description via LLM |
get_enrichment_status | enrichment, query | Check enrichment status for a product |
list_enrichment_queue | enrichment, query | List products pending enrichment |
get_taxonomy_tree | enrichment, query | Get category tree with product counts |
Enrichment is fully manifest-driven. Commerce has zero dependency on contextunity-router:
Commerce (Django PIM) │ ├── contextunity.project.yaml ← declares enricher + writer graphs │ ├── PIM Admin [Enrich] button │ └── calls export_product_for_enrichment (federated tool) │ │ │ ▼ │ Router loads enricher graph (yaml:enricher template) │ │ │ ├── prepare (federated) → export product context via BiDi │ ├── enrich (platform: router_generate_content) → LLM generation │ ├── review (platform: router_review_content) → quality check │ └── update (federated) → write results back to Django ORM via BiDi │ └── MCP tools for enrichment monitoring/triggeringCommerce connects to Router using auto-discovery via Redis:
# Commerce .envREDIS_URL=redis://localhost:6379 # Enables auto-discovery of contextunity.routerREDIS_SECRET_KEY=... # Required if Redis encryption is enabledLLM models and secrets are configured per-graph in the contextunity.project.yaml manifest. See above.
# Commerce — enrichment/writer federated toolsextensions/commerce/src/contextunity/commerce/├── mcp/tools/│ ├── enrichment.py # @federated_tool: export/update enriched products│ └── gardener.py # @federated_tool: normalize, classify├── pim/views/products/enrich.py # PIM admin enrichment endpoints├── harvester/management/commands/│ └── taxonomy_sync.py # Taxonomy sync to Brain└── wiki/models.py # Brand, Technology snippets
# Router — enricher template (shared by enricher + writer)services/router/src/contextunity/router/cortex/templates/└── enricher.yaml # prepare → enrich → review pipeline