COMMENCER
Un premier appel
Une recette, ses contraintes, un verdict. Le tout tient dans une requête.
La recette
Le harnais lit la plus petite structure sur laquelle un verdict peut se rendre : un titre, des ingrédients chiffrés, des étapes dans l’ordre. Une recette écrite par ChatGPT, par ton propre modèle ou lue dans un livre a déjà cette forme.
recette.json
{
"recipe": {
"title": "Satay de poulet",
"ingredients": [
{ "name": "cuisse de poulet", "quantity": "600", "unit": "g" },
{ "name": "beurre d’arachide", "quantity": "80", "unit": "g" },
{ "name": "sel", "quantity": "1", "unit": "c. à thé" }
],
"steps": [
{ "instruction": "Saisir les cuisses jusqu’à ce qu’elles soient bien dorées.", "tempC": 200 },
{ "instruction": "Fouetter la sauce jusqu’à ce qu’elle nappe la cuillère." }
]
},
"constraints": { "allergies": ["arachide"] }
}L’appel
curl
curl https://api.rikaido.app/v1/harness/validate \
-H "Authorization: Bearer $RIKAIDO_KEY" \
-H "Content-Type: application/json" \
-d @recette.jsonTypeScript
const res = await fetch("https://api.rikaido.app/v1/harness/validate", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RIKAIDO_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ recipe, constraints: { allergies: ["arachide"] } }),
});
const verdict = await res.json();
if (!verdict.safe) throw new Error("Refusée : " + verdict.issues[0].message);Python
import os, requests
r = requests.post(
"https://api.rikaido.app/v1/harness/validate",
headers={"Authorization": f"Bearer {os.environ['RIKAIDO_KEY']}"},
json={"recipe": recipe, "constraints": {"allergies": ["arachide"]}},
)
verdict = r.json()
if not verdict["safe"]:
raise ValueError(verdict["issues"][0]["message"])Ce qui revient
200
{
"ok": false,
"safe": false,
"issues": [
{
"code": "allergen-violation",
"severity": "error",
"safety": true,
"message": "…",
"constraint": "peanut",
"ingredient": "beurre d’arachide"
},
{ "code": "salt-out-of-band", "severity": "warn", "message": "…" }
],
"classification": { "category": "savory", "baked": false },
"constraints": { "allergies": ["arachide"], "dietaryPrefs": [], "exclusions": [] },
"feedback": "…"
}La réponse porte aussi un en-tête, Rikaido-Usage-Op: validate, qui dit ce que l’appel a coûté sans un deuxième appel. La page suivante lit le verdict ligne par ligne.