Table of Contents
- TenderBot — Documentatie
- API Endpoints
- POST /sessions
- POST /chat
- GET /sessions/{session_id}/history
- GET /sessions
- DELETE /sessions/{session_id}
- GET /health
- Systeemprompt
- Juridisch kader
- Aanbestedingsprocedures
- Programma van Eisen (PvE)
- Selectiecriteria
- Gunningscriteria
- Aanbestedingsdocumenten
- Duurzaamheid en sociale aspecten
- Praktische hulp
- Strikte afbakening
- Sessie-architectuur
- Configuratie
TenderBot — Documentatie
TenderBot is een gespecialiseerde AI-assistent die opdrachtgevers, inkopers en aanbestedende diensten ondersteunt bij het opstellen van kwalitatieve aanbestedingsdocumenten conform de Nederlandse wet- en regelgeving. De assistent is bedoeld voor professionals in de publieke sector en (semi-)overheidsorganisaties die te maken hebben met aanbestedingsprocedures, programma's van eisen, selectie- en gunningscriteria.
TenderBot maakt gebruik van het llama-3.3-70b-versatile model via de Groq API en wordt aangeboden via een FastAPI-gebaseerde REST-interface met een vernieuwde SmartTender-UI.
API Endpoints
POST /sessions
Maakt een nieuwe gesprekssessie aan en retourneert een uniek session_id (UUID v4) dat gebruikt moet worden bij vervolginteracties.
Request body: geen
Response body:
{
"session_id": "string (UUID)"
}
Curl-voorbeeld:
curl -X POST https://tenderbot.example.nl/sessions
POST /chat
Stuurt een bericht naar TenderBot binnen een bestaande sessie en ontvangt een antwoord. Het gespreksverloop wordt automatisch bewaard binnen de sessie.
Request body:
{
"session_id": "string",
"message": "string"
}
Response body:
{
"session_id": "string",
"reply": "string"
}
Curl-voorbeeld:
curl -X POST https://tenderbot.example.nl/chat \
-H "Content-Type: application/json" \
-d '{
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"message": "Welke procedure past bij een opdracht voor diensten van € 180.000 bij een gemeente?"
}'
GET /sessions/{session_id}/history
Haalt de volledige gespreksgeschiedenis op voor een specifieke sessie.
Request body: geen (session_id als path-parameter)
Response body:
{
"session_id": "string",
"messages": [
{
"role": "user | assistant",
"content": "string"
}
]
}
Curl-voorbeeld:
curl https://tenderbot.example.nl/sessions/550e8400-e29b-41d4-a716-446655440000/history
GET /sessions
Geeft een lijst van alle actieve sessie-ID's.
Request body: geen
Response body:
{
"sessions": ["string (UUID)", "..."]
}
Curl-voorbeeld:
curl https://tenderbot.example.nl/sessions
DELETE /sessions/{session_id}
Verwijdert een sessie en alle bijbehorende gespreksgeschiedenis uit het geheugen.
Request body: geen (session_id als path-parameter)
Response body:
{
"detail": "Sessie verwijderd."
}
Curl-voorbeeld:
curl -X DELETE https://tenderbot.example.nl/sessions/550e8400-e29b-41d4-a716-446655440000
GET /health
Eenvoudige health check-endpoint om de beschikbaarheid van de API te controleren.
Request body: geen
Response body:
{
"status": "ok"
}
Curl-voorbeeld:
curl https://tenderbot.example.nl/health
Systeemprompt
De systeemprompt van TenderBot definieert een diepgaande expertise op het gebied van Nederlandse aanbestedingen. De volgende kennisgebieden zijn ingebed:
Juridisch kader
- Aanbestedingswet 2012 (Aw 2012) en latere wijzigingen
- ARW 2016 (Aanbestedingsreglement Werken)
- Gids Proportionaliteit
- EU-richtlijnen 2014/24/EU en 2014/25/EU
- Actuele EU-drempelwaarden (werken: € 5.538.000; leveringen/diensten centrale overheid: € 143.000; decentrale overheid: € 221.000)
Aanbestedingsprocedures
Openbare procedure, niet-openbare procedure, mededingingsgerichte dialoog, innovatiepartnerschap, onderhandelingsprocedure (met/zonder bekendmaking), meervoudig onderhands en enkelvoudig onderhands.
Programma van Eisen (PvE)
Structurering van een PvE, toepassing van SMART-criteria, onderscheid tussen harde eisen (knock-out) en wensen, functionele versus technische eisen, en minimum-/maximum-/streefwaarden.
Selectiecriteria
Verplichte en facultatieve uitsluitingsgronden (art. 2.86 en 2.87 Aw 2012), geschiktheidseisen (economisch/financieel en technisch/beroepsmatig), UEA/ESPD, proportionaliteitsvereiste, combinatievorming, onderaanneming en beroep op derden.
Gunningscriteria
BPKV (Beste Prijs-Kwaliteitverhouding) als voorkeursmethode, EMVI met kwaliteitscriteria en wegingsfactoren, scoremethodieken (relatieve scoring, vaste scoretabel, fictieve korting), laagste prijs en LCC/TCO.
Aanbestedingsdocumenten
Aankondiging via TenderNed/TED, selectieleidraad, aanbestedingsleidraad, PvE, concept- en raamovereenkomsten, Nota van Inlichtingen, UEA, inschrijvingsformulier en prijzenblad.
Duurzaamheid en sociale aspecten
Milieucriteria, CO₂-Prestatieladder, GPP-criteria, SROI (Social Return on Investment), sociale voorwaarden en ILO-normen, circulaire inkoop en het MVI-beleid van de Rijksoverheid.
Praktische hulp
SMART-formulering van eisen, controlelijsten, advies over procedurekeuze, scorematrices, CPV-codes en publicatievereisten.
Strikte afbakening
TenderBot beantwoordt uitsluitend vragen die direct betrekking hebben op aanbestedingen, inkoop, programma's van eisen of aanverwante onderwerpen. Vragen buiten dit domein (zoals algemene kennis, technologie, reizen, recepten of nieuws) worden consequent geweigerd met een standaardantwoord dat de gebruiker doorverwijst naar een andere bron. De assistent gebruikt de beleefde aanspreekvorm 'u' en antwoordt altijd in het Nederlands.
Sessie-architectuur
TenderBot werkt met een eenvoudige in-memory sessiestore:
- Elke sessie krijgt een uniek UUID v4 als identifier, gegenereerd door
new_session(). - Sessies worden bewaard in een Python-dictionary
_sessions: dict[str, list[dict]], waarbij elke sessie een lijst van{"role": ..., "content": ...}-berichten bevat. - Bij elke
POST /chat-aanroep wordt de volledige gespreksgeschiedenis samen met de systeemprompt naar het taalmodel gestuurd, zodat de context behouden blijft. - Sessies kunnen expliciet verwijderd worden via
DELETE /sessions/{session_id}.
Let op: doordat de opslag in het werkgeheugen plaatsvindt, gaan alle sessies verloren bij een herstart van de API-server. Voor productiegebruik met persistente sessies is een externe store (bijv. Redis of een database) aan te raden.
Configuratie
Vereiste omgevingsvariabelen
| Variabele | Beschrijving | Verplicht |
|---|---|---|
GROQ_API_KEY |
API-sleutel voor toegang tot de Groq API | Ja |
Wanneer GROQ_API_KEY niet is ingesteld, gooit de applicatie een EnvironmentError met de melding "GROQ_API_KEY is niet ingesteld.".
Gebruikt model
- Model:
llama-3.3-70b-versatile - Provider: Groq
- Max tokens per antwoord: 4096
Voorbeeld
export GROQ_API_KEY="gsk_..."
uvicorn tenderbot.api:app --host 0.0.0.0 --port 8000
Na het starten zijn de Swagger-documentatie en de SmartTender-UI beschikbaar via respectievelijk /docs en /.