Praetor (Lat.): the Roman magistrate who heard a case and rendered judgment.
🌍 Live demo: app on Vercel · app on Hugging Face · backend API | Search any company on a 3D globe → watch 9 AI agents run diligence live → cited GO / NO-GO / CONDITIONAL verdict.
PRAETOR ingests a target's public footprint, runs parallel specialist diligence across every workstream, cross-references the findings into a single red-flag register, and renders a defensible GO / NO-GO / CONDITIONAL verdict — with every claim traceable to its source document.
Three ways to start a diligence:
- Pick any company on the 3D world globe — search the global GLEIF universe (millions of legal entities), the globe flies to the company's HQ city, and PRAETOR runs screening-led diligence (web search + sanctions/registry screening).
- Upload your own company report (PDF / DOCX / TXT / MD / CSV) — the agents read the document, screen the named company, and web-search its current standing.
- Run a US ticker through the full SEC EDGAR pipeline (10-K items, DEF 14A, EX-21 subsidiaries, EX-10 contracts, XBRL financials).
Hard rule: real data only. Findings are extracted from genuine sources — SEC EDGAR,
the real OFAC SDN list, OpenSanctions, GLEIF (legal-entity identity + global
search), GDELT (adverse media), GeoNames (HQ geolocation), and live web search
via Groq's compound model. Every finding cites the filing + item/clause, the registry
record, or the web source it came from. This is a capability demonstration over public
data — not investment advice.
It runs keyless and offline-capable by design: no API keys required, and a deterministic mock stands in for the LLM when none is configured (the LLM only narrates and ranks; facts are extracted deterministically and always cited).
One key unlocks two things, both via the same groq/compound system: live LLM
narration in the memos/verdict, and the PULSE agent's live web search for a
current-standing factor ("is this company healthy right now?"). Add it to backend/.env:
echo 'GROQ_API_KEY=gsk_your_key_here' >> backend/.envWithout it, narration is templated and PULSE falls back to a keyless GDELT adverse-media baseline — the system still runs end to end and tells you the key is needed.
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cd backend
# Diligence on First Solar (default target), live from SEC EDGAR:
python -m praetor run FSLR
# Any US-listed ticker; write the full cited memo to a file:
python -m praetor run NEE --out ../reports/nextera_memo.md
# Use only cached data (no network), or limit workstreams:
python -m praetor run FSLR --offline --only INTEGRITAS,FISCUS,LEXSet SEC_USER_AGENT to your own contact (SEC requires it for live pulls):
export SEC_USER_AGENT="PRAETOR-diligence/0.1 (you@example.com)"Optional keys (.env, see .env.example): GROQ_API_KEY enables live LLM
narration; OPENSANCTIONS_API_KEY, COMPANIES_HOUSE_API_KEY,
OPENCORPORATES_API_TOKEN enrich INTEGRITAS. None are required.
cd frontend
npm install
npm run dev # http://localhost:5173 — proxies /api to the backend on :8000The dashboard: a rotating 3D globe (react-globe.gl) you can search and fly to any company's HQ; a report upload panel; the verdict, diligence heatmap, red-flag register (every row linking to its source), the PULSE current-standing panel, the deal knowledge graph (D3), the valuation-impact layer, human gates, and audit trail.
If the backend isn't on
:8000, point the dev proxy at it:PRAETOR_API=http://localhost:8011 npm run dev.
cd backend
uvicorn praetor.api:app --reload --port 8000| Method | Route | Purpose |
|---|---|---|
| GET | /api/companies/search?q= |
global company search (GLEIF) with HQ lat/lng for the globe |
| POST | /api/deals/run |
diligence on a US ticker {ticker, offline, buyer, workstreams?} |
| POST | /api/deals/company |
screening diligence on a globe pick {name, lei, city, country} |
| POST | /api/deals/upload |
upload a report (multipart file, company, buyer) and run diligence |
| GET | /api/deals |
list analysed deals (with HQ coordinates) |
| GET | /api/deals/{id} |
deal summary + verdict + workstream rollup |
| GET | /api/deals/{id}/findings |
red-flag register (?workstream=, ?min_severity=) |
| GET | /api/deals/{id}/verdict |
verdict + valuation-impact layer + cross-refs |
| GET | /api/deals/{id}/graph |
deal knowledge graph (D3 nodes/links) |
| GET | /api/deals/{id}/memo |
full Markdown memo |
| GET | /api/deals/{id}/audit |
audit trail |
| GET | /api/deals/{id}/gates |
human-in-the-loop gates |
| POST | /api/gates/{id}/resolve |
sign off a gate {status, resolved_by, note} |
L0 ORCHESTRATION praetor/orchestrator.py — engagement lead: plan, parallel
dispatch, shared register, gates, verdict, audit
L1 KNOWLEDGE praetor/knowledge/ — SQLite medallion lakehouse
praetor/deal_factory.py (bronze/silver/gold), networkx
praetor/sources/ deal graph (UBO unwind), hybrid
index (BM25 + hashing embedding),
real data adapters
L2 SPECIALISTS praetor/agents/ — INTEGRITAS · FISCUS · LEX · AGORA ·
(run in parallel) CENSUS · PEOPLE · CYBER · ESG
L3 SYNTHESIS praetor/synthesis.py — cross-reference + valuation impact
praetor/tribunal.py TRIBUNAL: the GO/NO-GO/CONDITIONAL verdict
L4 OUTPUT / HITL praetor/report.py — cited memo, register, gates, audit
praetor/api.py
Design invariant: every Finding carries source_refs — no claim without
provenance. Agents extract findings deterministically from real sources (always
cited); the LLM only narrates and ranks, never the source of facts. That is the
system's headline anti-hallucination control and its audit story.
| Agent | Workstream | Reads | Flags |
|---|---|---|---|
| INTEGRITAS | Integrity & background | OFAC SDN, OpenSanctions, GLEIF, GDELT, deal graph | sanctions, PEP, adverse media, UBO/ownership, ABAC, related-party conflicts |
| FISCUS | Quality of earnings | XBRL companyfacts, MD&A | revenue trend, margins, cash conversion, leverage, concentration |
| LEX | Legal & contracts | EX-10, 10-K Item 3 | change-of-control, assignment, indemnity, caps, exclusivity, litigation |
| AGORA | Commercial | 10-K Item 1/1A | competition, pricing power, demand cyclicality, concentration |
| CENSUS | Tax | XBRL, risk factors | effective rate, NOLs, transfer pricing, audits |
| PEOPLE | HR | proxy, human capital | key-person, change-of-control payouts, pensions, labour |
| CYBER | IT / privacy | 10-K Item 1C, risk factors, report | incidents, IT dependence, GDPR/data-protection |
| ESG | ESG | risk factors, Item 3, report | environmental liability, climate transition, CSRD/LkSG, governance |
| PULSE | Live web pulse | Groq compound web search (or GDELT baseline) | current financial health, recent news, controversies → STRONG/STABLE/WATCH/DISTRESSED |
- ✅ L0–L4 backend, verified end-to-end on real data (live + cached): 9 workstreams, synthesis, TRIBUNAL, human gates, audit trail; CLI + REST API.
- ✅ Three diligence entry points: SEC ticker, uploaded report, globe company pick.
- ✅ 3D globe dashboard (react-globe.gl + D3): search, fly-to, verdict, heatmap, register with source links, PULSE panel, entity graph, valuation, gates, audit.
- ✅ Global company search (GLEIF) + offline HQ geolocation (GeoNames).
- ✅ Live web-search current-standing factor (PULSE via Groq compound; GDELT baseline keyless).
- ⬜ Richer financials for non-SEC reports (table/figure extraction beyond prose scan).