尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
BondCheck: an agentic AI platform for job-bond transparency
AI agents that read offer letters, extract and verify job-bond terms, and warn freshers before they sign.
Seven specialised agents turn anonymously uploaded offer letters into a verified, evidence-backed, searchable database of bond terms, answer students' questions with citations, and proactively alert them before placement drives.
All demo companies and people are fictional. BondCheck shows information reported in uploaded documents and public sources. It is not legal advice.檢視完整 README ↗AI agents that read offer letters, extract and verify job-bond terms, and warn freshers before they sign.
Seven specialised agents turn anonymously uploaded offer letters into a verified, evidence-backed, searchable database of bond terms, answer students' questions with citations, and proactively alert them before placement drives.
| Agents | Orchestrator · Privacy · Extraction · Verification · Q&A · Monitor · Alert |
| Stack | LangGraph · Claude API (Haiku + Sonnet) · FastAPI · PostgreSQL / SQLite · Next.js 16 + Tailwind 4 + Framer Motion |
| Runs without an API key | Yes. A deterministic offline engine drives the same agent graph, so everything works locally out of the box. |
All demo companies and people are fictional. BondCheck shows information reported in uploaded documents and public sources. It is not legal advice.
Backend (Python 3.12):
cd bondcheck
python -m venv .venv
.venv\Scripts\activate # macOS/Linux: source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # optional: add ANTHROPIC_API_KEY, DATABASE_URL, …
python -m db.seed # runs ~70 synthetic letters through the real agent pipeline
uvicorn api.main:app --port 8000 # API docs at http://localhost:8000/docs
Frontend (Node 20+):
cd bondcheck/frontend
npm install
cp .env.example .env.local # NEXT_PUBLIC_API_URL=http://localhost:8000
npm run dev # http://localhost:3000
Moderator console: http://localhost:3000/admin (local token: dev-admin-token).
Tests and evaluation:
pytest -q # 35 tests: tools, agents, guardrails, API
python -m eval.run_eval # writes eval/results.json + eval/report.md (shown on /how-it-works)
| Setting | Effect |
|---|---|
No ANTHROPIC_API_KEY | Offline rule engine for classification, PII detection and extraction; a deterministic planner for Q&A; web search disabled; scanned letters need Tesseract. |
ANTHROPIC_API_KEY set | claude-haiku-4-5 classifies documents, double-checks PII and transcribes scans; claude-sonnet-5-5 extracts fields (structured JSON output), answers questions in a tool-use loop and researches public sources with web search. Sonnet calls opt in to server-side refusal fallbacks. |
No DATABASE_URL | Local SQLite at data/bondcheck.db (auto-created and seeded on first API start). |
DATABASE_URL set | PostgreSQL (Neon/Supabase). Run db/schema.sql, then optionally db/seed.sql. Create the read-only Q&A role from the bottom of schema.sql and put it in DATABASE_URL_READONLY. |
┌──────────────────────────────┐
Events ─────────────▶│ ORCHESTRATOR AGENT │ LangGraph state graph:
• New upload │ plans, routes, retries (≤2), │ routing, retries, token budget,
• Student question │ budgets, escalates to humans │ interrupt() for human input
• Scheduled job └──────────────┬───────────────┘
┌─────────────────┬─────────────────┼──────────────────┬─────────────────┐
▼ ▼ ▼ ▼ ▼
PRIVACY ──▶ EXTRACTION ──▶ VERIFICATION Q&A AGENT MONITOR ──▶ ALERT
redact + quote-verified corroborate / read-only SQL, (daily) (7 days before
re-scan ×3 self-check loop variant / conflict / exit-cost calc, a drive)
│ outlier / new_company citations
▼ ▼
uploader confirms moderation queue PostgreSQL + agent_runs log
Workflow A, upload. intake → [ocr] → classify → privacy → extraction ⟲ → [confirm: interrupt()] → verification → finalize (document deleted). Any step can route to reject (not an offer letter, PII left after 3 scans, unreadable) or escalate (failed after 2 retries, over the token budget). Every event streams to the UI as NDJSON.
Workflow B, question. The Q&A agent calls find_company, run_readonly_sql, calc_exit_cost and get_evidence, and must cite record IDs, upload counts and dates.
Workflow C, monitoring. The Monitor agent checks drives in the next 30 days for missing, stale or conflicting data, saves public findings as unverified records, and creates "data needed" requests. The Alert agent emails subscribers 7 days before a drive, and skips "no bond, high confidence" alerts unless the student opted in.
verify_quote() confirms every quote exists in the (redacted) document, which catches made-up values.₹1.5 lakh → 150000, two (2) years → 24).| Single-pass extraction | Agentic (self-check + re-read) | + uploader confirmation | |
|---|---|---|---|
| Field accuracy | 88.5% | 99.6% | 100% |
| Hallucinated fields | 22 | 0 | — |
| Metric | Target | Result |
|---|---|---|
| Field-level extraction accuracy | ≥ 90% | 99.6% |
| PII leak rate (stored records) | 0% | 0% (0 of 335 planted items; also 0 left in redacted text) |
| Hallucinated values stored | 0% | 0% |
| Conflict detection precision / recall | ≥ 85% | 100% / 100% |
| Q&A answers with correct citations | ≥ 95% | 100% (24 questions) |
| Time per upload | measured | ~0.01 s offline (0 tokens) |
Read these honestly. The test letters come from the same generator the extraction rules were developed against (different random seeds), so this is an upper bound. The 5 scanned letters were skipped because no OCR was available. Add real, consented letters to eval/ and re-run with ANTHROPIC_API_KEY set to get the Claude numbers, plus cost per letter.
bondcheck/
├── agents/ orchestrator.py (LangGraph) · privacy · extraction · verification · qa · monitor · alert
├── tools/ documents (extract_text, ocr_image, read_section, verify_quote) · pii · database
│ (find_company, run_readonly_sql, save_record, moderation) · calculator · normalize · web · notify
├── core/ config · llm (Claude wrapper, token budget) · state (UploadState) · runlog (events + agent_runs)
├── api/main.py FastAPI: /upload, /upload/{id}/confirm, /ask, /companies, /company/{id}, /drives,
│ /subscribe, /samples, /admin/*, /cron/*
├── db/ schema.sql (PostgreSQL) · schema_sqlite.sql · seed.py → seed.sql
├── eval/ letters.py (synthetic generator) · synthetic_letters/ · ground_truth.json · run_eval.py
├── tests/ pytest suite
├── frontend/ Next.js app: home, companies, company page, upload (live agent run), ask, drives, how-it-works, admin
├── .github/workflows/agents-cron.yml daily Monitor + Alert (alternative to Vercel Cron)
└── Dockerfile API image (includes Tesseract)
Additions beyond the design doc's schema: moderation_queue.note, users.alert_all, agent_runs.run_ref, and the data_requests and alerts_sent tables, which the Monitor and Alert agents need. company_summary also exposes company_id.
| Risk | Guardrail |
|---|---|
| Personal data leak | Redact → independent re-scan with broader rules → redact again; reject after 3 failures. Files are processed in memory, and raw text leaves the graph state right after the Privacy Agent. |
| Made-up values | Every stored value needs a quote that verify_quote() finds; otherwise it's dropped. |
| Wrong arithmetic | calc_exit_cost is plain Python. |
| Dangerous SQL | SELECT-only, single statement, table allow-list, automatic LIMIT, timeout, read-only connection (SQLite authorizer / Postgres read-only role). |
| Fake uploads | Document-type check, outlier rules, moderation queue. |
| Prompt injection in letters | Letter text is wrapped as data with an explicit rule; instruction-like text is flagged in the run log. |
| Runaway agents | ≤ 2 retries per step, token budget per run, recursion limit, every step logged to agent_runs. |
frontend/ to Vercel. Set NEXT_PUBLIC_API_URL and CRON_SECRET; vercel.json schedules the Monitor and Alert agents daily through /api/cron/[job].docker build -t bondcheck-api . and run on Render, Railway, Fly.io or Cloud Run with DATABASE_URL, ANTHROPIC_API_KEY, ADMIN_TOKEN, CRON_SECRET, RESEND_API_KEY, CORS_ORIGINS. Alternatively use the GitHub Actions cron in .github/workflows.Built a multi-agent system (LangGraph, Claude API, FastAPI, PostgreSQL, Next.js) in which 7 specialised agents redact personal data, extract offer-letter terms with quote-verified self-checking, detect conflicting reports, answer questions with cited SQL-backed answers, and proactively alert students before placement drives. The agentic extraction loop improved field accuracy from 88.5% to 99.6% over single-pass extraction and cut hallucinated fields from 22 to 0, with a 0% PII leak rate across 50 synthetic test documents.
(Re-measure with the Claude engine and real letters before using these numbers publicly.)