Inspiration
Public tenders are long PDFs: 100 to 200 pages of conditions, forms and specifications. A small supplier has a few days to decide whether it can even bid, and one missed requirement can disqualify the bid. We build tender software at Lucius AI and wanted an open, transparent version of the core idea: let a model read the whole tender, but make every claim checkable against the page it came from.
What it does
- Find: Tavily Search looks for tenders on the open web, leaves out paywalled aggregator sites and puts the buyer's own government documents first.
- Find its documents: most results are notice or listing pages, not documents. A small agent reads the page with Tavily Extract, lets Nemotron 3 Super pick the tender's own documents (or the pages to open next, two levels deep), and probes every link: only files whose first bytes are a PDF are offered to read.
- Read: Nemotron 3 Super reads the PDF six pages at a time, in parallel, and returns every requirement with a verbatim quote, its page, a category and whether it is mandatory. A page ledger fills in live as pages are read.
- Read scans: a page with no text layer (a signed form, a scanned ordinance) is drawn as an image and transcribed by NVIDIA Nemotron 3.5 Super VL. The transcription becomes that page's text for the reader and for the quote check, and every requirement from it is tagged "scanned page". At most 40 scanned pages a run, all within 120 seconds; a scan that is not read is named, never filled in.
- Check: every quote is matched against the text of its page. Wrong page numbers are corrected; quotes the model stitched from two passages of one page are checked piece by piece and labelled; anything not found stays in the list, flagged, never hidden.
- Decide: Nemotron 3 Ultra checks the scope from the first pages, then judges every mandatory requirement against the company profile (fails, to confirm, met, routine form) in parallel batches. The verdict is computed from those judgments, not chosen by the model, and the requirements that decide it come first, each linked to its page.
- Export: "Download the checklist" gives an Excel workbook built on the server from the finished run: a Checklist sheet (requirement, the tender's own words, page, category, mandatory, judgment, why, quote check and an empty Done column) and a Summary sheet with the call, the scanned pages and the models used. "or as CSV" gives the same list as CSV. Tender text never runs as a formula in either file.
On a real 120-page municipal pump-station tender it read every page in about a minute, found all 172 quotes on their pages, and called no bid for a pump supplier because the same tender also buys PLC, SCADA and telemetry design.
On a 375-page pump station tender from the City of Tampa whose pages 18 to 26 are a scanned city ordinance, a live run on 22 October read all 375 pages, the nine scans included, in about 2 minutes 45 seconds; 387 of 392 quotes were found on their page, all 11 from the scans among them. The scans added the city's apprenticeship rules (at least 12% of labor hours by apprentices), and certifying an apprenticeship program, read from a scanned page, was among the requirements that decide the call (bid, with conditions, 85%).
How we built it
Python, FastAPI and a single vanilla-JS page with Server-Sent Events for live progress; PyMuPDF for page text. The models run on Nebius Token Factory through its OpenAI-compatible API: nvidia/nemotron-3-super-120b-a12b reads (JSON-schema output) and finds documents, nvidia/Nemotron-3.5-Super-VL transcribes scanned pages (one call per page image), and nvidia/Nemotron-3-Ultra-550b-a55b decides. Tavily Search and Extract find tenders and their documents. It runs on Cloud Run with per-visitor and daily limits, openpyxl builds the checklist workbook, and 82 offline tests cover the pipeline with a fake model, PDFs generated in the test (image-only scans included), mocked HTTP, and a replay of recorded Token Factory replies for a PDF with two scanned pages.
Nebius Token Factory retires nvidia/nemotron-3-super-120b-a12b on 9 November 2026, before judging. Since 30 October the live demo's reader and document finder therefore run on nvidia/Nemotron-3.5-Super-VL, Nebius's recommended replacement, with thinking off. On the 44-page tender of the saved example it read all 44 pages and found all 113 quotes on their pages, with the same call (bid with conditions).
Challenges we ran into
- At the default reasoning effort, Nemotron 3 Super spent its whole token budget thinking on dense tender pages and returned empty answers for 2 of 8 chunks; "medium" was worse.
reasoning_effort: lowanswered every chunk in about 8 seconds, and an empty answer is retried once with thinking off. - A single free-form verdict call answered "bid 0.92", "no bid 0.95" and "bid with conditions 0.75" on the same list. Per-requirement judgments with a computed verdict made the call stable and traceable.
- One call judging 78 requirements skipped two thirds of them, so the judgments run in batches of 20 and skipped ids are asked again.
- At temperature 0 with high reasoning, Ultra looped on a 135-link page until the token limit; NVIDIA's suggested temperature 0.6 / top_p 0.95 fixed it.
Limitations
- The call is advice from a model, not a legal or commercial opinion. Read the tender yourself before you bid.
- Requirement counts and the call vary from run to run on the same tender. On 22 October the same 120-page tender gave "bid with conditions" in two runs and "no bid" in one, with 133 to 189 requirements; the 375-page Tampa tender gave 214 to 404 requirements across runs. Every item still links to its page and its quote, so any run can be checked.
- Scanned pages: at most 40 a run are read from the page image, all within 120 seconds. Scans over the cap, scans the vision model fails on twice and scans not done in time are named on the page and in the export, and nothing from them is in the list.
- On a scanned page the quote check proves the quote is in the vision model's own transcription, not that the transcription is right. Compare the quote with the page image; handwriting and stamps may come out badly or as [illegible].
- A page whose text was turned into vector outlines (some drawings) has neither text nor an image, so it is reported as blank rather than read.
- The quote check proves a quote is on its page. It does not prove that the plain-English requirement is a fair summary of the quote; read the quote.
- The live demo is capped per visitor and per day, and a run is kept in memory for one hour.
- The address check follows every redirect and resolved address, but DNS can change between the check and the connection: run your own copy without access to internal networks.
Accomplishments that we're proud of
Every requirement on screen links to its page and its quote has been checked against that page. The bid call is the sum of visible judgments, not a black box.
What we learned
Reasoning models need their effort and sampling tuned per task: low effort for high-volume extraction, more for navigation, and never temperature 0 with long thinking.
What's next
More tender portals in the finder. (OCR for scanned pages and the checklist export, listed here on 15 Oct, shipped on 22 Oct.)
Built With
- fastapi
- google-cloud-run
- nebius-token-factory
- nvidia-nemotron
- openpyxl
- pymupdf
- python
- tavily