LLM agent that turns a product image plus a short spec into a publish-ready catalog entry (Markdown + JSON sidecar).
Status: Phase 1 of 5 (synchronous walking skeleton). See the ADRs in docs/architecture-decision-records/ for use-case and UI framework decisions.
- Accepts a product image plus an optional text spec via a Chainlit chat UI.
- Calls Claude Sonnet with vision to produce a structured product page.
- Writes
output/products/<slug>.mdandoutput/products/<slug>.json.
Future phases will add an async queue, web search enrichment, and batch processing with prompt caching.
Requires Python 3.11+.
# 1. Set up a virtual environment and install
python -m venv .venv
. .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
# 2. Configure your API key
cp .env.example .env # then edit .env and set ANTHROPIC_API_KEY
# 3. Run
chainlit run app/chainlit_app.pyOpen the URL Chainlit prints (default http://localhost:8000). Drop a product image into the chat. Optionally type a short spec ("merino wool, made in Portugal, 250g"). Watch the generated Markdown appear and check output/products/.
A sample product is provided in samples/hydronord-bottle/:
hydronord-trail-750.jpg— product imagespecs.json— brand, materials, dimensions
To test: open the Chainlit UI, drag hydronord-trail-750.jpg into the chat,
and paste the contents of specs.json as the message text.
The generated page will appear in output/products/.
You only need an Anthropic API key for Phase 1. Get one at https://console.anthropic.com/settings/keys.
- Phase 1 (Done): synchronous Chainlit + Claude vision, Markdown output.
- Phase 2: async Redis + RQ queue, Docker Compose, worker service.
- Phase 3: Tavily web search tool for category/SEO enrichment.
- Phase 4: batch upload, fan-out per product, aggregated
catalog.json, prompt caching for shared context. - Phase 5: polish, sample dataset, full README, "what's next".
The unmodified recruitment exercise brief is preserved in EXERCISE.md.