Jev — modèle de décision
MarkdownLe modèle de décision Jev de TypeSafe répond à des questions typées sur du texte ou du JSON : choix d’une option, évaluation sur une échelle ou oui/non avec des probabilités. Ce n’est ni un chat ni un générateur de texte.
Guide complet
https://api.ailoot.ai/v1/systemonecurl https://api.ailoot.ai/v1/systemone \
-H "Authorization: Bearer $AILOOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "jev-latest",
"state": "Au secours ! Mes versements échouent depuis 3 jours.",
"questions": {
"is_urgent": {
"type": "noul",
"instructions": "Cela exprime-t-il une urgence ?"
}
}
}' import json, os, urllib.request
body = {
"model": "jev-latest",
"state": "Au secours ! Mes versements échouent depuis 3 jours.",
"questions": {
"is_urgent": {"type": "noul", "instructions": "Cela exprime-t-il une urgence ?"},
},
}
req = urllib.request.Request(
"https://api.ailoot.ai/v1/systemone",
data=json.dumps(body).encode(),
headers={"Authorization": "Bearer " + os.environ["AILOOT_API_KEY"],
"Content-Type": "application/json"},
)
with urllib.request.urlopen(req, timeout=60) as resp:
result = json.load(resp)
print(result["answers"]["is_urgent"]["noul"]) # 0.95const resp = await fetch("https://api.ailoot.ai/v1/systemone", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AILOOT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "jev-latest",
state: "Au secours ! Mes versements échouent depuis 3 jours.",
questions: {
is_urgent: { type: "noul", instructions: "Cela exprime-t-il une urgence ?" },
},
}),
});
const result = await resp.json();
if (!resp.ok) throw new Error(`${resp.status} ${JSON.stringify(result)}`);
console.log(result.answers.is_urgent.noul); // 0.95{
"model": "jev-1.13.0",
"answers": {
"is_urgent": {
"type": "noul",
"noul": 0.95
}
},
"usage": { "input_tokens": 296, "output_tokens": 20 }
}Jev est un modèle de décision de classe System One proposé par TypeSafe. Il ne rédige pas de texte et ne dialogue pas : vous transmettez un état (state) — sous forme de texte ou de JSON — et un ensemble de questions, puis recevez des valeurs typées accompagnées de probabilités. Votre code peut directement effectuer des branchements, trier et router sans analyser du texte libre.
Toutes les questions d’une requête sont évaluées en parallèle et indépendamment, sur le même state. Selon TypeSafe, ajouter des questions modifie très peu le temps de réponse et les questions n’interfèrent pas entre elles.
| Élément | En bref |
|---|---|
| Modèle | jev-latest — alias de la dernière version stable de Jev ; fiche du catalogue |
| Méthode | POST /v1/systemone. Ce n’est pas un chat : les formats OpenAI, Anthropic et Gemini ne conviennent pas à Jev. La réponse arrive entière, sous la forme d’un seul JSON |
| Entrées acceptées | Uniquement du texte : chaîne, objet JSON ou tableau de textes. Convertissez d’abord les images, l’audio et la vidéo en texte |
| Contexte | 64K tokens par requête, state et toutes les questions réunis ; state avec la question la plus longue : jusqu’à 32K |
| Langue | Selon TypeSafe, le modèle est le plus précis en anglais. Il accepte d’autres langues, avec une précision inférieure : testez-le sur vos données |
| Prix | Entrée : 0,084 USD pour 1 million de tokens ; sortie gratuite |
Requête
Autorisation
- Authorizationheaderobligatoire
Clé Ailoot au format
Bearer sk-….
Corps de la requête
- modelstringobligatoire
jev-latest. - statestring | object | arrayobligatoire
Contenu à évaluer : chaîne de texte ou JSON, demande d’un client, enregistrement de base de données, échange ou état actuel de votre application. Un objet avec des noms de champs clairs est généralement plus pratique qu’une seule chaîne.
- questionsobjectobligatoire
Questions. Vous choisissez les clés et les réponses utilisent les mêmes clés. La clé n’influence pas la réponse : la question est définie dans
instructions. - questions.*.typestringobligatoire
noul,choiceouscore— voir ci-dessous. - questions.*.instructionsstring | object | arrayobligatoire
La question elle-même. Une longue question contenant des données peut être transmise sous forme d’objet : la question dans un champ et les données dans les autres. Référencez les champs par leur nom entre accents graves.
- questions.*.criteriaobject | array
Options de réponse propres à chaque type : descriptions de oui et non pour noul (facultatives), dictionnaire d’options pour choice, liste ordonnée de niveaux pour score.
Types de questions
| Type | Question posée | Valeur renvoyée |
|---|---|---|
noul | L’affirmation est-elle vraie : oui ou non | noul — probabilité de oui, de 0 à 1 |
choice | Quelle option parmi celles proposées convient | choice, probabilities, confidence |
score | Où se situe state sur votre échelle de niveaux | score, legend, probabilities, confidence |
Vous pouvez combiner plusieurs types dans une même requête.
noul — oui ou non
Le champ criteria est facultatif : il peut décrire la signification de oui (true) et de non (false). La réponse noul — nombre de 0 (non) à 1 (oui).
"is_urgent": {
"type": "noul",
"instructions": "Cela exprime-t-il une urgence ?",
"criteria": {
"true": "Explicitement soumis à une contrainte de temps",
"false": "Aucune urgence exprimée"
}
}"is_urgent": {
"type": "noul",
"noul": 0.95
}choice — choix d’une option
criteria — dictionnaire « option → description ». Si aucune description n’est nécessaire, indiquez null. Jusqu’à 255 options. Dans la réponse, choice — l’option la plus probable, probabilities — la probabilité de chaque option (somme égale à 1), confidence — confiance de 0 à 1.
"department": {
"type": "choice",
"instructions": "Quelle équipe doit s’en charger ?",
"criteria": {
"billing": "Paiements, facturation, remboursements",
"technical": "Bugs, pannes, intégrations",
"sales": "Tarifs, passages à une offre supérieure, nouveaux clients"
}
}"department": {
"type": "choice",
"choice": "billing",
"probabilities": { "billing": 0.88, "technical": 0.12, "sales": 0.0 },
"confidence": 0.81
}score — évaluation sur une échelle
criteria — niveaux classés du plus bas au plus haut, au maximum 10 (TypeSafe recommande au moins deux). Dans la réponse, score — valeur pondérée par les probabilités des niveaux, qui peut se situer entre deux niveaux, legend — numéro du niveau et sa description, probabilities et confidence. Selon TypeSafe, score convient à une comparaison avec un seuil, mais pas à une valeur exacte entre les niveaux.
"frustration": {
"type": "score",
"instructions": "À quel point le client est-il frustré ?",
"criteria": ["Calme", "Frustré", "Très en colère"]
}"frustration": {
"type": "score",
"score": 1.05,
"legend": { "0": "Calme", "1": "Frustré", "2": "Très en colère" },
"probabilities": { "0": 0.0, "1": 0.95, "2": 0.05 },
"confidence": 0.92
}Réponse
- modelstring
Version du modèle ayant répondu. L’alias jev-latest évolue vers de nouvelles versions. Si vous avez réglé les seuils de
confidencepour une version précise, surveillez ce champ. - answersobject
Une réponse pour chaque question, sous les mêmes clés. Chaque réponse comporte
type; pour choice et score, égalementconfidence. - usageobject
input_tokensetoutput_tokens. Seuls les tokens d’entrée sont facturés.
Plusieurs questions en une seule requête
Posez toutes les questions sur un même state dans une requête unique : elles sont évaluées en parallèle et state n’est transmis qu’une fois. Selon TypeSafe, dans leur exemple avec 13 questions, une requête commune était 12,2 fois moins chère et 10 fois plus rapide que 13 requêtes séparées envoyées successivement, pour les mêmes réponses.
Il vaut mieux décomposer un jugement complexe en questions simples et combiner les réponses dans le code. Par exemple, au lieu de « évaluer la demande », évaluez séparément le marché, la faisabilité et la différenciation par rapport aux concurrents. Les pondérations changent alors dans le code, et non dans la question.
{
"model": "jev-latest",
"state": "Au secours ! Mes versements échouent depuis 3 jours.",
"questions": {
"department": {
"type": "choice",
"instructions": "Quelle équipe doit s’en charger ?",
"criteria": {
"billing": "Paiements, facturation, remboursements",
"technical": "Bugs, pannes, intégrations",
"sales": "Tarifs, passages à une offre supérieure, nouveaux clients"
}
},
"frustration": {
"type": "score",
"instructions": "À quel point le client est-il frustré ?",
"criteria": ["Calme", "Frustré", "Très en colère"]
},
"is_urgent": {
"type": "noul",
"instructions": "Cela exprime-t-il une urgence ?"
}
}
}Quand l’utiliser
- Routage. Diriger une demande vers le bon service et une requête vers le bon système de traitement : du code simple, un grand modèle ou une personne.
- Tri et priorité. Urgence, tonalité et risque évalués sur une échelle, avec des seuils dans le code.
- Modération et vérifications. Vérifier si un message enfreint les règles, si une source confirme une citation ou si un document répond à une question, avant de transmettre le texte.
- Notation et classement. Évaluer des documents, des candidats ou des passages trouvés selon votre grille, puis décider dans le code de ce qui sera transmis à l’étape suivante.
- À la place d’un fragile « renvoie du JSON ». Un appel qui retourne des valeurs typées par construction, au lieu d’un texte à analyser.
Quand ne pas l’utiliser
- Chat, réponses aux utilisateurs, génération de texte ou de code. Jev ne rédige pas de texte ; pour cela, utilisez les modèles textuels.
- Modèle pour Claude Code, Cursor et d’autres agents. Vous ne pouvez pas remplacer le modèle d’un agent par jev-latest : l’agent a besoin d’un modèle qui rédige du texte et appelle des outils. Vous pouvez appeler Jev depuis le code que l’agent écrit pour vous.
- Arithmétique, comptage et comparaison de dates. Selon TypeSafe, il est plus fiable de les effectuer dans le code et de ne demander au modèle que l’interprétation sémantique, par exemple extraire les éléments d’une date via choice.
- Images, audio et vidéo. Le modèle accepte uniquement du texte. Convertissez ces données en texte au préalable.
Prix
Seuls les tokens d’entrée sont facturés — champ usage.input_tokens de la réponse : 0,084 USD pour 1 million. Les tokens de sortie sont gratuits.
La requête de l’exemple de cette page (296 tokens d’entrée) coûte moins de $0.0001.
Avant la requête, Ailoot réserve une somme sur votre solde puis, après la réponse, effectue un seul débit selon l’utilisation réelle — comment cela fonctionne.
Limites
| Élément | Limite |
|---|---|
| Requête entière : state et toutes les questions | 64K tokens |
| state avec la question la plus longue | 32K tokens |
| Nombre d’options dans un choice | jusqu’à 255 |
| Nombre de niveaux dans un score | de 2 à 10 |
| Entrée | uniquement du texte : chaîne, objet JSON ou tableau de textes |
Les limites du modèle sont celles indiquées par TypeSafe. Les restrictions de votre clé et de votre solde s’appliquent comme pour tout modèle Ailoot : Erreurs et limites.
Erreurs
Les erreurs utilisent le format commun Ailoot API : code, message clair et Request ID. Les cas les plus fréquents pour cette méthode sont :
| Code | Quand | Que faire |
|---|---|---|
400 invalid_request | Corps non validé : state, model ou questions manquants, type inconnu, plus de 255 options dans choice ou plus de 10 niveaux dans score | Corrigez la requête d’après le message d’erreur. Sans modification, elle échouera à nouveau |
400 context_length_exceeded | state et les questions dépassent ensemble la limite du modèle | Filtrez state dans le code et conservez les données utiles aux questions |
401 invalid_api_key | Clé absente ou incorrecte | Transmettez la clé dans l’en-tête Authorization |
402 insufficient_balance | Solde disponible insuffisant pour le montant à réserver | Rechargez le solde |
404 model_not_found, unsupported_endpoint | ID incorrect ou modèle appelé avec une mauvaise méthode, par exemple via /v1/chat/completions | Appelez jev-latest uniquement via POST /v1/systemone |
429 rate_limit_exceeded | Trop de requêtes | Attendez le nombre de secondes indiqué dans l’en-tête Retry-After, puis réessayez |
503 model_overloaded, model_unavailable | Modèle temporairement surchargé ou indisponible | Si X-Should-Retry : true, réessayez après le nombre de secondes indiqué dans Retry-After ; si false, vérifiez d’abord le Request ID dans l’historique |
504 model_timeout | Le modèle n’a pas répondu à temps | Ne renvoyez pas la requête avant d’avoir vérifié le Request ID dans l’historique |
La liste complète des codes figure sur la page Erreurs et limites.