Cookies on this site

We would like to use cookies to understand how the site is used and to measure our campaigns. Nothing is set until you choose, and you can change your mind at any time from “Cookie settings” at the foot of every page. Privacy policy

Contact UsContact Us

Work / Internal case study

  • Hybrid & Edge AI
  • AI Agents
  • Public-sector sales

Procurement triage on a local 30B model: 2,000 listings a day, 50 worth reading

Our own bid desk was drowning in government procurement portals. We built a pipeline that logs in to five portals every morning, reads every listing, pulls and parses the solicitation documents, judges each bid against exclusion rules and emails a short list — with every model call running on a desktop box in our office.

Client
Princeton IT Services (internal)
Team
2 engineers, 10 weeks
Stack
Python · Playwright · Ollama · SQL Server · Microsoft Graph · NemoClaw
Hardware
NVIDIA GB10 desktop (ASUS Ascent GX10)

Results

  • 2,000 → 50

    listings a day reduced to a readable short list

  • 11×

    faster than the 120B model on the same bids

  • 7 / 7

    verdicts identical, byte-identical inputs

  • 0

    document text sent to any cloud API

The problem

Five portals, five logins, roughly 2,000 new listing rows a day. A bid writer was spending the first hours of every morning deciding what not to read. Missed deadlines and missed set-asides were the quiet cost.

What we built

A 16-stage pipeline, each stage an independent module with state passed through SQL Server rather than memory. Playwright handles the logins and downloads; a 93-keyword filter removes about 92% of rows before any model is involved; the model is asked four narrow questions per bid — eligibility, commercial terms, technical requirements and submission mechanics — against anchored passages, never the whole document.

The daily output is a register spreadsheet, two PDFs and an email to four people. A bid that is waiting on a human login is reported as such, not as a failure.

Why the smaller model won

We ran eight cached notices through both nemotron-3-nano (30B) and nemotron-3-super (120B) on byte-identical input. Verdicts were 7/7 identical. The 30B model ran in 59 seconds against 651 for the 120B, found 11 fields the larger model left empty, and never timed out. The 120B also returned three fabricated exclusions — the error nobody notices, because a wrong exclusion produces no row at all.

Guardrails

Exclusion flags are honoured only if the triggering language actually appears in the document. Truncated model output is salvaged field by field rather than discarded. Nothing leaves the host: the models run under Ollama on a desktop GB10 system, and the project deliberately does not defeat bot protection — where a portal blocks automation, a person logs in and only the session cookie is imported.

How a bid moves

One bid, seven states

A verdict always overwrites PENDING; PENDING never overwrites a verdict. A bid with no verdict is unsettled and gets picked up again.

  1. Discovered

    listing row; keyword pre-filter stops ~92% here

  2. Candidate

    detail fetched; new or due for re-check

  3. Judged

    KEPT / EXCLUDED / PENDING / FAILED

  4. Enriched

    docs scanned, fetched, parsed, model-extracted

  5. Re-judged

    exclusions re-tested; can still flip

  6. Linked

    off-portal documents chased or flagged

  7. Delivered

    register + 2 PDFs + Excel + email

More work

Related projects

Same practice areas, different problems.

All case studies
  • In production

    Hours → minutes

    Food manufacturing

    AI Consulting

    Document intake agent for a national food cooperative

    A Copilot Studio agent reads certificates of analysis as they arrive in the quality team's inbox, extracts 14 fields with AI Builder, checks them, files the PDF in SharePoint and posts a summary in Teams. Fields it is unsure about go to a person instead of being guessed.

    • Hours of daily filing down to minutes
    • 14 fields per document, validated
  • Delivered

    Every change, flagged

    Food manufacturing

    AI Consulting

    Label comparison agent for a national food cooperative

    Compares two versions of a product label, highlights every change, annotates the PDF and returns an audit-ready list of differences. We moved it from Copilot Studio to Azure Functions when the document processing outgrew the low-code platform.

    • Audit-ready differences in one chat turn
    • Rebuilt from low-code to cloud functions
  • In delivery

    4 systems, 1 record

    Food manufacturing

    Systems Integration

    One customer record across four business systems for a national food cooperative

    Wholesale customers sign up in the online store, are approved in the CRM, copied to the ERP and marketed to from a separate platform, and changes made by phone reached none of the others. The workflow keeps customer records, approvals, order history and profile changes in step across all four, and flags anything that needs a person.

    • Four systems, one customer record
    • Exceptions routed to a named reviewer

Have a daily chore that eats a skilled person's morning?

We will scope it in a 30-minute call and tell you whether a local model can take it.

Tell us what you are working on

A few lines is enough. The engineers who do this work will reply within one business day.

Or email it.services@princetonits.com or call +1 (212) 507-9350.