Teo FurlanEspañol

Projects / Pricor

Pricor

Overview

The models fill the form, the engine does the math, you sign. Supplier price lists in Excel or CSV become one normalized catalog.

Role
Designer and developer
Tags
  • ai
Stack
  • Python
  • uv
  • FastAPI
  • openpyxl
  • xlrd
  • SQLite
  • Decimal
  • Ollama
  • Gemma 4 E4B
  • bge-m3
  • Laya
  • PyTorch
  • React
  • Vite
  • TypeScript
  • Vitest
  • pytest
Team
Solo, 2026
What I owned
Everything: the domain contract and the exact decimal engine, the file adapters, the FastAPI server, the Laya fine-tuning and its synthetic corpus, the benchmark, the React interface in English and Spanish, and the docs.
price listmodelyouenginecatalogxlsx / csvLaya → Gemmaconfirmexact mathnormalized
FIG. 1.3 · Models propose, the engine calculates, you sign. Schematic, not to scale.

Problem

Small Argentine stores (hardware, stationery, distributors) get weekly supplier price lists in Excel or CSV. Every supplier names its columns differently and leaves out metadata: is VAT included or net, is the price per pack or per unit, is the discount a chain like 10+5, which currency, which number format. Point-of-sale and ERP systems accept only rigid layouts, so loading by hand is slow, and a misread column silently corrupts costs.

I built Pricor to turn those lists into one normalized catalog that the store’s own system can import.

It’s a research prototype. It has no users yet, no customers and no measured time savings, and I’m not claiming any. I’ve tried it on public price lists from six distributors, not in weekly use at a store.

Constraints

The decision and why

Models propose, the engine calculates, you sign. A model never executes anything and never does arithmetic. It picks column roles from a closed set, or suggests answers, and you confirm.

Result

Measured on a held-out test set of 29 columns from two distributors the system had never seen, on an RTX 4060 Laptop GPU. The set is small and is missing some roles (VAT rate, units per pack, barcode, discount, currency), so please read these as a first signal, not a guarantee.

Approach Correct columns
Gemma 4 E4B alone 25 of 29 (86.2 %)
Heuristics 24 of 29 (82.8 %), optimistic: the rules were written after seeing one distributor’s headers
Laya fine-tuned 22 of 29 (75.9 %)
Laya zero-shot 18 of 29 (62.1 %)

The cascade, which only settles answers it is confident about:

That means most columns still reach a person. Laya settles only about 10 % because its confidence separates poorly below its threshold.

Speed: Laya takes 35.4 ms per column on GPU and 516.5 ms on CPU (means); Gemma takes 11.4 s per sheet. The Laya fine-tune took 290 s and peaked at 6.2 GB of VRAM.