5 API Documentation
Wiki Bot edited this page 2026-05-12 21:23:35 +00:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

TenderBot — API Documentatie

TenderBot is een AI-assistent voor Nederlandse aanbestedingen. De bot helpt opdrachtgevers en inkopers bij het opstellen van kwalitatieve aanbestedingsdocumenten conform de Aanbestedingswet 2012, het ARW 2016, de Gids Proportionaliteit en de geldende EU-richtlijnen. Onder de motorkap draait llama-3.3-70b-versatile via de Groq API.

De API is gebouwd met FastAPI en biedt sessiegebaseerde chat met optionele gestructureerde context per sessie. Interactieve documentatie is beschikbaar op /docs (Swagger UI) en /redoc.

Endpoints

POST /sessions — Nieuwe sessie aanmaken

Maakt een nieuwe chatsessie aan. Optioneel kunt u context meegeven (string of JSON-object) die bij elke vraag als achtergrondkennis aan het AI-model wordt gekoppeld.

Request body

{
  "context": {
    "beschrijving": "Aanbesteding HR-software voor middelgrote gemeente",
    "aanbestedingstype": "Europese openbare procedure",
    "sector": "ICT / HR",
    "eisen_categorieen": [
      {"categorie": "Functioneel", "toelichting": "Salarisadministratie en verlofregistratie"},
      {"categorie": "Security", "toelichting": "ISO 27001 en NEN 7510"}
    ]
  },
  "username": "j.devries"
}

Response 200

{
  "session_id": "f7c3e1a4-...-9b21",
  "context": { "...": "..." },
  "username": "j.devries"
}

Curl-voorbeeld

curl -X POST https://tenderbot.example.nl/sessions \
  -H "Content-Type: application/json" \
  -d '{"context": "HR-software aanbesteding voor gemeenten", "username": "j.devries"}'

POST /chat — Bericht versturen

Stuurt een gebruikersbericht naar TenderBot binnen een bestaande sessie en ontvangt het antwoord van de assistent. Berichten worden opgeslagen in de geschiedenis.

Request body

{
  "session_id": "f7c3e1a4-...-9b21",
  "message": "Welke uitsluitingsgronden zijn verplicht onder Aw 2012?"
}

Response 200

{
  "session_id": "f7c3e1a4-...-9b21",
  "reply": "De verplichte uitsluitingsgronden zijn opgenomen in artikel 2.86 Aw 2012..."
}

Fouten

  • 400 — Bericht is leeg
  • 500GROQ_API_KEY ontbreekt

Curl-voorbeeld

curl -X POST https://tenderbot.example.nl/chat \
  -H "Content-Type: application/json" \
  -d '{"session_id": "f7c3e1a4-...-9b21", "message": "Welke gunningscriteria past het beste?"}'

GET /sessions — Lijst alle sessies

Response 200

{ "sessions": ["f7c3e1a4-...-9b21", "a12b..."] }

Curl-voorbeeld

curl https://tenderbot.example.nl/sessions

GET /sessions/{session_id}/history — Geschiedenis ophalen

Response 200

{
  "session_id": "f7c3e1a4-...-9b21",
  "messages": [
    {"role": "user", "content": "Welke procedure adviseert u?"},
    {"role": "assistant", "content": "Op basis van de opdrachtwaarde..."}
  ]
}

Fouten: 404 als sessie niet bestaat.

Curl-voorbeeld

curl https://tenderbot.example.nl/sessions/f7c3e1a4-.../history

DELETE /sessions/{session_id} — Sessie verwijderen

Response 200

{ "detail": "Sessie verwijderd." }

Fouten: 404 als sessie niet bestaat.

Curl-voorbeeld

curl -X DELETE https://tenderbot.example.nl/sessions/f7c3e1a4-...

GET /health — Gezondheidsstatus

Response 200

{ "status": "ok" }

Sessie context

Het context-veld op POST /sessions accepteert zowel een vrije string als een gestructureerd JSON-object. Wanneer een gestructureerd object wordt meegegeven, formatteert TenderBot dit automatisch tot een leesbare contextblok dat aan de system prompt wordt toegevoegd.

Gestructureerd schema

Veld Type Beschrijving
beschrijving string Korte omschrijving van de opdracht
aanbestedingstype string Type procedure (openbaar, niet-openbaar, MCD, etc.)
sector string Sector of branche van de opdracht
eisen_categorieen array van objecten Lijst met categorieën van eisen die geformuleerd moeten worden
eisen_categorieen[].categorie string Naam van de categorie (bv. "Functioneel", "Security")
eisen_categorieen[].toelichting string Optionele toelichting bij de categorie

Aanvullende sleutels worden eveneens meegestuurd als key: value-regels.

Volledig JSON-voorbeeld

{
  "context": {
    "beschrijving": "Aanbesteding voor een nieuw HR- en salarissysteem voor gemeente Voorbeeldstad",
    "aanbestedingstype": "Europese openbare procedure",
    "sector": "ICT / Personeel & Organisatie",
    "eisen_categorieen": [
      {
        "categorie": "Functionele eisen",
        "toelichting": "Salarisadministratie, verlof- en verzuimregistratie, self-service"
      },
      {
        "categorie": "Technische eisen",
        "toelichting": "SaaS-oplossing, koppeling met financieel pakket via REST"
      },
      {
        "categorie": "Security & privacy",
        "toelichting": "ISO 27001, NEN 7510, AVG-compliance, data binnen EU"
      },
      {
        "categorie": "Duurzaamheid",
        "toelichting": "MVI-criteria Rijksoverheid, CO₂-Prestatieladder niveau 3"
      },
      {
        "categorie": "SLA & support",
        "toelichting": "Beschikbaarheid 99,5%, support 08:0018:00"
      }
    ],
    "geschatte_waarde": "€ 850.000 over 4 jaar",
    "looptijd": "4 jaar met optie tot verlenging 2x 1 jaar"
  },
  "username": "j.devries"
}

Configuratie

Variabele Standaard Beschrijving
GROQ_API_KEY (verplicht) API-sleutel voor de Groq inference service
TENDERBOT_DB /opt/tenderbot/tenderbot.db Pad naar het SQLite-databasebestand