De tekst is begrijpelijk. Toch kan de applicatie hem niet overnemen, want de hoeveelheid staat er een keer als ‘zes’, een keer als 6 en een keer als zin in de opmerking. Structured outputs geven deze overdracht een contract. Het interessantere deel begint waar correcte JSON inhoudelijk fout kan zijn.
Mistrals Custom Structured Outputs gebruiken hiervoor een vooraf gedefinieerd JSON-schema. Velden en datatypen worden expliciet beschreven. Dat ordent de interface tussen model en applicatie; het vervangt niet de controle of een waarde werkelijk door de brontekst wordt ondersteund.
Onbekend is een eigen toestand
Onze fictieve notitie noemt mappen, maar geen hoeveelheid. De uitvoer moet deze ontbrekende waarde behouden. Als je in plaats daarvan een standaardhoeveelheid invult, lijkt het gegevensrecord vollediger en gaat er onderweg een belangrijk stuk informatie verloren.
Een klein, leveranciersneutraal schema kan er zo uitzien. Welke schemasleutelwoorden een bepaalde interface ondersteunt, moet je vóór gebruik controleren aan de hand van de actuele documentatie:
{
"type": "object",
"required": ["artikel", "menge", "klaerung"],
"additionalProperties": false,
"properties": {
"artikel": {"type": "string"},
"menge": {"type": ["integer", "null"], "minimum": 0},
"klaerung": {"type": "string"}
}
}
required eist dat het veld aanwezig is. null staat desondanks een expliciet onbekende waarde toe. De ondergrens geldt voor numerieke hoeveelheden. Of een hoeveelheid voor het werkelijke bestelproces toelaatbaar is, kan aanvullende bedrijfsregels vereisen. Het schema beantwoordt vooral welke vorm de applicatie verderop kan verwachten.
Een voorbeeldweergave zonder model en zonder bestelling
Je kunt de verwerking al met vaste voorbeeldgegevens bekijken. Sla het volgende HTML-fragment, dat wij hebben geschreven, op als lokaal voorbeeldbestand en open het in de browser. Het toont een gegevensrecord, maar doet geen API-verzoek en slaat geen bestelling op.
<!doctype html>
<meta charset="utf-8">
<p id="ausgabe"></p>
<script>
const daten = { artikel: "Folders", menge: null, klaerung: "Quantity missing" };
function pruefe(d) {
if (!d || typeof d !== "object" || Array.isArray(d)) throw Error("Object expected");
const keys = Object.keys(d).sort().join(",");
if (keys !== "artikel,klaerung,menge") throw Error("Check fields");
if (typeof d.artikel !== "string" || typeof d.klaerung !== "string")
throw Error("Text expected");
if (d.menge !== null && (!Number.isInteger(d.menge) || d.menge < 0))
throw Error("Check quantity");
}
pruefe(daten);
const menge = daten.menge === null ? "not yet known" : String(daten.menge);
document.querySelector("#ausgabe").textContent =
daten.artikel + ": " + menge + ". " + daten.klaerung;
</script>
De functie is een beperkte eigen validator voor precies dit lesschema, geen volledige JSON Schema-bibliotheek. Verander de hoeveelheid achtereenvolgens in 6, in -1 en in de string ‘zes’. Voeg daarna een onverwacht veld toe. Bekijk telkens de weergave of de foutmelding in de ontwikkelaarstools.
Zo kun je een overgang testen voordat er een model bij betrokken is. Je weet hoe de applicatie omgaat met bekende, onbekende en ongeldige waarden. Een later modelantwoord kan dit fragment alleen bereiken nadat het dezelfde regels heeft doorstaan.
Vorm en betekenis los van elkaar controleren
Een formeel toegestane 6 kan toch fout zijn als de notitie vier zegt. Voeg in een echte applicatie daarom waar nodig een verwijzing naar de bron toe en controleer belangrijke waarden aan de hand van de invoer. Bij tegenstrijdige notities moet het proces een punt ter verduidelijking opleveren in plaats van een willekeurig getal te kiezen.
De uitvoer gebruikt textContent. Externe tekst wordt dus als tekst ingevoegd in plaats van zonder enige controle als HTML te worden geïnterpreteerd. Sleutels van providers horen niet thuis in een browserfragment als dit. Een modelaanroep zou een aparte verwerkingsstap zijn met eigen toegang en eigen foutafhandeling.
Het fragment op een website demonstreren
Als je precies deze kleine weergave op een bestaande website wilt tonen, is de ontwikkelaarsmodus van KENJTEC WebSiteBuilder ai ook een mogelijke plek voor je eigen HTML/JavaScript-code. Het gecontroleerde fragment wordt met de hand overgezet; codepreview en eigen codeversies ondersteunen de daaropvolgende controle. Dit creëert geen native koppeling met Mistral.
Het eigenlijke inzicht blijft onafhankelijk van waar het wordt gebruikt: modelformaat, je eigen validator, veilige weergave en de inhoudelijke beslissing hebben verschillende taken. Wie ze uit elkaar houdt, kan een AI-uitvoer gericht overnemen zonder een plausibel antwoord ongemerkt in een handeling te veranderen.
Bronnen en stand van zaken
Bronnen per 25 oktober 2026. Custom Structured Outputs.

