Table of Contents

Documentatie voor Debot API

De Debot API biedt toegang tot de finetuned modellen gebaseerd op de Alpaca-7B en Bloom-7B. Deze documentatie omvat een overzicht van de beschikbare endpoints debatten kunnen worden gegenereerd.

Authenticatie

Elke aanvraag aan de Debot API moet worden geauthenticeerd door middel van een API-sleutel. Deze sleutel dient meegegeven te worden in de request headers. Gebruik hiervoor de Debot-API-Key header. Aanvragen zonder geldige API-sleutel worden geweigerd.

Basis URL

De basis URL voor alle API-aanroepen is https://debot.lodder.dev/.

Definities

In deze API-documentatie gebruiken we bepaalde termen met specifieke betekenissen:

  • De term "party" verwijst binnen onze API naar politieke partijen, individuen, of fracties die betrokken zijn bij debatten of discussies.
  • De term "post" duidt op het specifieke overheidsonderdeel of bestuursorgaan waaraan een bewindslied is verbonden.

Aan het einde van dit document worden voor zowel "party" als "post" whitelisted waarden vermeld. Hoewel onze modellen in staat zijn om diverse input te verwerken, anticiperen we op optimale resultaten wanneer de aangegeven terminologie wordt aangehouden, waar mogelijk.

Het model zou bijvoorbeeld kunnen herkennen dat "PvdD" en "Partij voor de Dieren" dezelfde entiteit vertegenwoordigen. Echter, gezien de consistentie waarmee "PvdD" in de trainingsdata voorkomt, is het aannemelijk dat het model sterker reageert op deze specifieke afkorting.

Modeldefinities

Centraal binnen onze API is het SessieObject. De API faciliteert het genereren van debatten via een specifiek endpoint, dat werkt met een structuur genaamd DebateRequest. Dit object speelt een cruciale rol door de vereisten voor een debat te specificeren.

DebateRequest beschrijft de input voor het /debat endpoint. Het geeft aan welk SessieObject betrokken is, welke deelnemers willen worden meegenomen in de volgende berichten, of de response dummy-data moet teruggeven (debug=True), met welk model (Alpaca of Bloom) het debat gegenereerd moet worden, en of het model een enkel (single_message=True), of een onbepaald aantal berichten mag genereren.

{
    "session": "<SessieObject>"
    "debug": bool,
    "single_message": bool,
    "desired_speakers": ["<SprekerObject>", ...],
    "model": "String (alpaca | bloom)"

}

Let op: Wanneer debug uitstaat worden de requests doorgestuurd naar de GPU servers. Gelieve tijdens ontwikkelen van de frontend debug op True houden.

De desired_speakers bieden een manier om de gewenste deelnemers aan het debat met het model te communiceren. Deze worden meegenomen in de context prompt aan het model, zodat het weet welke deelnemers het debat heeft. Echter is dit geen garantie dat het model ook daadwerkelijk deze deelnemers meeneemt in de berichten die het genereert. Vooral als er reeds berichten zijn, zou het goed kunnen dat het model de interactie voortzet tussen de sprekers die reeds gesproken hebben.

Met behulp van single_message kan worden gevraagd aan het model om een enkel bericht te genereren. De API zal zodoende ook

Sessie Object

  • Type: JSON Object
  • Beschrijving: Representeert een debatsessie met zijn onderwerp, bijbehorende regering, berichten, deelnemers, en het gebruikte model voor generatie.
{
    "subject": "String",
    "session_type": "String (antwoord-schriftelijke-vragen | commissie-debat | plenair-debat)",
    "government": "<RegeringsObject>",
    "messages": ["<BerichtObject>", ...],
}

RegeringsObject

  • Type: JSON Object
  • Beschrijving: Beschrijft de regering waarin het debat plaatsvindt, inclusief de naam en status.
{
    "name": "String (Balkenende IV | Rutte I | Rutte II | Rutte III | Rutte IV)",
    "status": "String (governing | demissionair)"
}

BerichtObject

  • Type: JSON Object
  • Beschrijving: Representeert een bericht in het debat, inclusief de tekst en de spreker.
{
    "text": "String",
    "speaker": "<SprekerObject>"
}

SprekerObject

  • Type: JSON Object
  • Beschrijving: Een object dat een spreker in het debat vertegenwoordigt, die een Tweede Kamerlid, Minister, of Voorzitter kan zijn. Het role-veld bepaalt het specifieke type spreker en hun attributen.
  • Lid
    {
        "role": "member",
        "party": "String (<party>)",
        "post": None,
    }
    
  • Bewindslied
    {
        "role": "String (minister | staatssecretaris | minister-president)",
        "party": None,
        "post": "String (Optioneel) (<post>)",
    }
    
  • Voorzitter
    {
        "role": "chair",
        "party": None,
        "post": None,
    }
    

API Specificatie

Eindpunt: `/debate`

Dit endpoint is ontworpen om zowel de aanmaak als de voortzetting van debatten te faciliteren. Het verwerkt de volgende datastructuur als input:

{
    "session": "<SessionObject>",
    "desired_speakers": ["<SprekerObject>", ...],
    "debug": bool,
    "single_message": bool,
    "model": "String (alpaca | bloom)",
}

Na verwerking retourneert het een bijgewerkt session, waarbij de lijst van berichten is uitgebreid.

Indien debug=True, ontvangt u dummy-data als respons; in het andere geval wordt gebruik gemaakt van het opgegeven model om het debat te genereren.

Indien single_message=True, geeft de API een enkel nieuw bericht terug.

Het systeem bepaalt de huidige deelnemerslijst van het debat op basis van de sprekers in de berichten van het geretourneerde session_object.

Lege berichtenlijsten triggeren de aanmaak van initiële berichten, terwijl een reeds gevulde lijst zal resulteren in de generatie van vervolgberichten door het model.

desired_speakers specificeert de beoogde nieuwe deelnemers voor de volgende fase van het debat. Samen met de bestaande sprekers in de berichten, helpt dit het model te bepalen wie aan het debat deelnemen.

Whitelisted Waarden

Voor gebruik in eventuele keuzemenu's aan de voorkant volgen hier wat lijsten met waardes die we zijn tegengekomen in de trainingsdata. In principe kan alles in het model worden gegooid, maar we verwachten de beste resultaten als met deze benamingen wordt gewerkt.

Posten

POST_VALUES = [
    "Algemene Zaken",
    "Armoedebeleid, Participatie en Pensioenen",
    "Basis- en Voortgezet Onderwijs en Media",
    "Binnenlandse Zaken en Koninkrijksrelaties",
    "Buitenlandse Handel en Ontwikkelingssamenwerking",
    "Buitenlandse Zaken",
    "Defensie",
    "Economische Zaken",
    "Economische Zaken en Klimaat",
    "Economische Zaken, Landbouw en Innovatie",
    "Financiën",
    "Financiën – Fiscaliteit en Belastingdienst",
    "Immigratie en Asiel",
    "Immigratie, Integratie en Asiel",
    "Infrastructuur en Milieu",
    "Infrastructuur en Waterstaat",
    "Jeugd en Gezin",
    "Justitie en Veiligheid",
    "Klimaat en Energie",
    "Landbouw, Natuur en Voedselkwaliteit",
    "Landbouw, Natuurbeheer en Visserij",
    "Langdurige Zorg en Sport",
    "Medische Zorg",
    "Natuur en Stikstof",
    "Onderwijs, Cultuur en Wetenschap",
    "Primair en Voortgezet Onderwijs",
    "Rechtsbescherming",
    "Sociale Zaken en Werkgelegenheid",
    "Veiligheid en Justitie",
    "Verkeer en Waterstaat",
    "Volksgezondheid, Welzijn en Sport",
    "Volkshuisvesting en Ruimtelijke Ordening",
    "Volkshuisvesting, Ruimtelijke Ordening en Milieubeheer",
    "Wonen en Rijksdienst",
    "Wonen, Wijken en Integratie",
]

Parties

[
    "50PLUS",
    "50PLUS/Baay-Timmerman",
    "50PLUS/Klein",
    "50PLUS/Krol",
    "BBB",
    "BIJ1",
    "Brinkman",
    "CDA",
    "CU",
    "ChristenUnie",
    "D66",
    "DENK",
    "Fractie Den Haan",
    "FvD",
    "GroenLinks",
    "Groep Bontes/Van Klaveren",
    "Groep Kortenoeven/Hernandez",
    "Groep Krol/van Kooten-Arissen",
    "Groep Kuzu/Öztürk",
    "Groep van Haga",
    "JA21",
    "Lid Bontes",
    "Lid-Verdonk",
    "Lid-van Vliet",
    "PVV",
    "PvdA",
    "PvdD",
    "SGP",
    "SP",
    "UWV",
    "VNL",
    "VVD",
    "Volt",
    "het lid Houwers",
    "lid Gündog˘ an",
    "lid Klein",
    "lid Krol",
    "lid Monasch",
    "lid Omtzigt",
    "lid Van Bemmel",
    "lid Van Klaveren",
    "lid van Haga",
    "lid van Kooten-Arissen",
]

RegeringObject

De volgende RegeringObjects zijn mogelijk:

governments = [
    {"name": "Balkenende IV", "status": "governing"},
    {"name": "Balkenende IV", "status": "demissionair"},
    {"name": "Rutte I", "status": "governing"},
    {"name": "Rutte I", "status": "demissionair"},
    {"name": "Rutte II", "status": "governing"},
    {"name": "Rutte II", "status": "demissionair"},
    {"name": "Rutte III", "status": "governing"},
    {"name": "Rutte III", "status": "demissionair"},
    {"name": "Rutte IV", "status": "governing"},
    {"name": "Rutte IV", "status": "demissionair"},
]

example curl command:

curl -v -X POST "https://debot.lodder.dev/api/v1/debate" \
     -H "Content-Type: application/json" \
     -d '{
  "session": {
    "subject": "het bericht <<heel Nederland staat in de fik >>",
    "session_type": "antwoord-schriftelijke-vragen",
    "government": {
      "name": "Rutte IV",
      "status": "governing"
    },
    "messages": []
  },
  "desired_speakers": [
    {
      "role": "member",
      "party": "GroenLinks",
      "post": null
    },
    {
      "role": "minister",
      "post": "Economische Zaken en Klimaat"
    }
  ],
  "debug": true,
  "model": "alpaca"
}'