Sin Liang LeeSL Lee

Arkiba AI

Turns messy construction Bill of Quantities workbooks into classified cost data, and answers cost questions with the source rows as evidence.

Role
Lead engineer, about 98% of commits
Context
Client work at AI.SEA, Kuala Lumpur
Stack
Python, OpenAI Agents SDK, FastAPI, PostgreSQL, DuckDB, React, Docker
Arkiba’s review screen for the synthetic Northstar Residences bill, with a dialog previewing one Level 5 classification correction applied to three identical rows.
Fig. 1 Synthetic demo data: a reviewer’s Level 5 correction, previewed on the identical rows it will also change.

What it is

Construction cost estimates arrive as Bill of Quantities (BQ) workbooks in Excel, and their layouts are inconsistent. Arkiba reads them, classifies each priced item, reconciles the money against the source and lets a team ask cost questions in plain language.

This is private client work. The repository is not public, and the numbers on this page come from a synthetic demo dataset, not client data.

What I built

  • The pipeline end to end: ingest, normalize, classify, store, export.
  • Multi-agent schema discovery for workbook layouts it has not seen before, using the OpenAI Agents SDK with deterministic validation, sandboxed analysis and an adversarial reviewer.
  • Human review and explicit acceptance before data enters the workspace, with immutable audits and versioned pricing snapshots.
  • A natural-language cost engine for benchmarking across projects, historical price comparison, projections and anomaly detection, keeping every answer traceable to source rows.

Technical notes

  • In the synthetic demo, 5,037 workbook rows become 443 priced items.
  • The deterministic engine (ingest, normalize, store) never imports the agent stack. The boundary is a hard rule in the codebase.
  • Each priced item gets a Level 5 construction classification label, marked as matched, derived or needs review. Uncertain items are flagged, never dropped.
  • Identical rows (same description, same context) are classified once and the decision is copied to their twins.
  • Accepted data is organized as project → BQ → dated priced version, so benchmarks can add distinct BQs without merging parallel pricing scopes inside one bill.