2 API Documentation
Wiki Bot edited this page 2026-05-11 21:35:11 +00:00

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 /.