Agentic multimodal tender compliance copilot for South African SMEs. Built with Amazon Nova on AWS Bedrock for the Amazon Nova AI Hackathon 2026.
Problem: South African SMEs spend days manually cross-referencing tender requirements against their company documents, often missing requirements and losing bids.
Solution: TenderLens ingests a tender RFP and evidence documents, uses Amazon Nova to extract every mandatory returnable, match evidence via multimodal embeddings, and produce a compliance matrix — in minutes, not days.
# One command to start everything
./scripts/run_demo.shThen open http://localhost:5173, upload the sample tender and evidence, and watch TenderLens analyse compliance in real time.
See scripts/demo_walkthrough.md for step-by-step instructions.
cd backend
pip install -e ".[dev]"
pytest tests/ -v # 52 tests
uvicorn app.main:app --reload --port 8000cd frontend
npm install --legacy-peer-deps
npm run dev # http://localhost:5173python scripts/generate_sample_data.py./scripts/integration_test.sh- Ingest — Upload tender PDF and evidence documents (PDF, PNG, JPG)
- Extract — Amazon Nova 2 Lite extracts mandatory returnables from the tender via Converse API
- Embed — Amazon Nova Multimodal Embeddings vectorizes all document pages (text + images, 1024-dim)
- Search — For each requirement, find matching evidence via cosine similarity
- Decide — Amazon Nova 2 Lite evaluates whether each requirement is complete, missing, or unclear
- Export — Generate a compliance matrix (JSON), CSV checklist, and per-requirement evidence folders as a downloadable ZIP
| Component | Technology |
|---|---|
| Reasoning | Amazon Nova 2 Lite (us.amazon.nova-2-lite-v1:0) via Converse API with tool use |
| Embeddings | Amazon Nova Multimodal Embeddings (amazon.nova-2-multimodal-embeddings-v1:0, 1024-dim) |
| Vector Store | In-memory numpy cosine similarity |
| Backend | FastAPI + Python 3.11 |
| Frontend | React + Vite + Tailwind CSS v4 |
| Ingestion | PyMuPDF (PDF), Pillow (images) |
| Agent | Deterministic pipeline (default) or LLM-driven agentic loop |
| Export | ZIP with compliance matrix, CSV, summary, per-requirement folders |
tenderlens/
├── backend/
│ ├── app/
│ │ ├── agent/ # Deterministic + agentic compliance loops
│ │ ├── schemas/ # Pydantic v2 data models
│ │ ├── services/ # Embeddings, vector store, ingestion, export, pipeline
│ │ ├── tools/ # Extract requirements, search evidence, decide compliance
│ │ ├── config.py # Settings from verified_config.json
│ │ └── main.py # FastAPI app with REST endpoints
│ └── tests/ # 52 unit tests
├── frontend/
│ └── src/
│ ├── components/ # FileDropZone, StatusProgress, SummaryCards, ComplianceTable, MetricsPanel, StatusBadge
│ ├── pages/ # UploadPage, ResultsPage
│ ├── lib/ # API client (axios)
│ └── App.tsx # State-based routing
├── scripts/
│ ├── generate_sample_data.py
│ ├── integration_test.sh
│ ├── run_demo.sh
│ └── demo_walkthrough.md
└── sample_data/ # Generated tender + evidence for demo
| Method | Path | Description |
|---|---|---|
| GET | /health |
Health check with model info |
| POST | /api/ingest |
Upload tender + evidence files |
| GET | /api/status/{job_id} |
Pipeline progress (poll every 2s) |
| GET | /api/compliance/{job_id} |
Compliance matrix with decisions |
| GET | /api/export/{job_id} |
Export download URL |
| GET | /api/metrics/{job_id} |
Pipeline metrics (tokens, latency) |
- Amazon Nova 2 Lite — Reasoning, requirement extraction, and compliance decisions via the Converse API with structured tool use
- Amazon Nova Multimodal Embeddings — Text and image embeddings for semantic evidence search (1024-dim vectors)
cd backend && pytest tests/ -v
# 52 tests covering schemas, ingestion, embeddings, vector store, tools, agent loop, and export#AmazonNova