GemText Agent
Built GemFind's data mapping app — turns any vendor's CSV or Excel into the GemFind jewelry schema with 17 specialized agents and zero per-vendor code.
Overview
GemFind ingests jewelry catalogs from hundreds of vendors, each shipping its own column names, formats, and quirks. I shipped gemTextAI — a FastAPI plus Next.js platform that maps any vendor file to the GemFind standard schema through a configurable rule engine paired with 17 domain-specific mapping agents. Onboarding a new vendor is now a 4-sheet Excel template, not a code change, with built-in versioning, rollback, and change-log auditing across the whole pipeline. We spun the new Venv for each vendor with custom main.py file from vendor which runs against the base and mapping files to generate expected results.
What we shipped
◆ Designed and built the dynamic transformation engine, a JSON rule store plus a deterministic interpreter that replaces vendor-specific code with database-driven config.
◆ Shipped 17 specialized mapping agents covering essentials, gemstones, pricing, sizing, media, watches, diamonds, configurable products, and value normalization.
◆ Built the 4-sheet Excel template parser and end-to-end vendor onboarding flow so adding a vendor is a config upload, not a deploy.
◆ Implemented version control with one-click rollback and full change-log auditing for every mapping rule and config change.
◆ Wired multi-database Redis caching and in-memory chunked processing for large catalog files.
◆ Added optional OpenAI-assisted column matching as a fallback when static mappings don't resolve.
◆ Built the Next.js admin UI, Vendor Details, Transformation Upload, Transformation Files, Transformation Scripts, and the per-section mapping editors with value-mapping modals.
Tools, standards, assumptions.
- Python
- FastAPI
- Next.js
- TypeScript
- PostgreSQL
- SQLAlchemy
- Redis
- OpenAI
- Tailwind
- data-mapping
- jewelry
- fastapi
- nextjs
- vendor-onboarding
What changed.
Numbers from the live store after the work was shipped — measured against pre-existing baselines, never theoretical.