Skip to Content
Référence APIDécisions

Decisions API

La Decisions API permet à un modèle de prendre des décisions typées sur un contenu au lieu de générer du texte. Vous fournissez le contenu à évaluer et un ensemble de questions, et le modèle renvoie une réponse structurée pour chacune : la probabilité d’un oui ou d’un non, un choix unique parmi une liste d’options, ou une note sur une échelle graduée, accompagnés des probabilités de chaque option et d’une valeur de confiance.

L’API est conçue pour la classification, le routage, la modération, la notation, le filtrage et tout autre cas où votre code doit bifurquer directement selon le résultat. Le modèle ne peut répondre qu’avec les options et les niveaux que vous définissez, jamais en dehors ; il n’y a donc aucun texte libre à analyser.

Lors de la première utilisation d’un modèle de décision, il est recommandé de consulter d’abord le guide d’utilisation de Jev, qui couvre le démarrage rapide, la conception des questions, l’interprétation des résultats et des exemples de scénarios. Cette page constitue la référence au niveau des champs.

Endpoints

Les trois endpoints servent les mêmes modèles avec la même tarification ; seuls les formats de requête et de réponse diffèrent. Choisissez celui qui correspond à votre client :

EndpointFormatAdapté à
POST https://api.ofox.ai/v1/decisionsFormat unifié OfoxAI (questions sous forme de tableau)cURL, tout client HTTP, le SDK OpenAI
POST https://api.ofox.ai/openai/v1/decisionsIdentique au précédentProjets dont le base_url du SDK OpenAI est déjà défini sur https://api.ofox.ai/openai/v1
POST https://api.ofox.ai/typesafe/v1/systemoneFormat officiel TypeSafe System One (questions sous forme d’objet)Le SDK officiel TypeSafe, ou du code écrit d’après la documentation officielle de TypeSafe

L’authentification fonctionne comme pour les autres endpoints : Authorization: Bearer <votre OFOXAI_API_KEY>. Seules les requêtes sans streaming sont prises en charge ; chaque requête renvoie toutes les réponses de façon synchrone.

Modèles disponibles

ID de modèleDescription
typesafe/jev-latestTypeSafe Jev, un modèle dédié à la décision. Entrée texte ou JSON uniquement, contexte de 64K. Peut s’abréger en jev-latest
openai/gpt-6-lunaFonctionne sur les trois endpoints ; peut lire des images (passez input_image dans le tableau de messages)

La liste complète des modèles compatibles avec cette API figure sur la page des modèles . Un appel avec un modèle de chat ordinaire (par exemple openai/gpt-4o) renvoie endpoint_not_supported.

Format unifié : /v1/decisions

Paramètres de la requête

ParamètreTypeRequisDescription
modelstring✅ID du modèle, par exemple typesafe/jev-latest
inputstring | object | array✅Le contenu à évaluer ; voir Format d’entrée
questionsarray✅Liste des questions, chacune étant un objet question. Les réponses sont renvoyées dans le même ordre
safety_identifierstring—Identifiant stable de l’utilisateur final ; s’applique uniquement aux modèles OpenAI

Format d’entrée

input accepte trois formes :

  • Texte : une chaîne unique.
    "input": "Customer message: I was charged twice, nobody has answered my two emails, and I need a refund today."
  • Données structurées : un objet JSON, transmis tel quel au modèle. Les questions peuvent faire référence aux noms de champs entre backticks, par exemple `message`.
    "input": { "ticket_id": 4812, "message": "I was charged twice.", "plan": "pro" }
  • Tableau de messages : [{ "role", "content" }], où content est une chaîne ou une liste de blocs de contenu. Seuls les blocs input_text et input_image sont pris en charge. Les images ne fonctionnent qu’avec les modèles capables de les lire. Jev ne lit pas les images ; en envoyer une renvoie 400.

Objet question

ChampS’applique àDescription
typeTouspredicate (oui/non), choice (choix unique) ou score (note graduée)
nameTousFacultatif mais recommandé. Renvoyé tel quel dans la réponse pour faciliter la correspondance. Doit être unique au sein d’une requête
instructionsTousLa question elle-même. Une chaîne, ou un objet JSON contenant la question et des données de référence
criteriapredicateFacultatif. { "true": "...", "false": "..." } décrit ce que signifient respectivement oui et non
choiceschoiceRequis. Tableau d’options, chacune de la forme { "value": "billing", "description": "Charges, refunds" } ; description est facultatif. 255 options au maximum
levelsscoreRequis. Tableau de niveaux ordonnés du plus bas au plus élevé, chacun de la forme { "label": "low", "description": "..." }. De 2 à 10 niveaux

Exemples de requête

Terminal
curl https://api.ofox.ai/v1/decisions \ -H "Authorization: Bearer $OFOX_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "typesafe/jev-latest", "input": "Customer message: I was charged twice, nobody has answered my two emails, and I need a refund today.", "questions": [ { "type": "predicate", "name": "is_frustrated", "instructions": "Is the customer frustrated?" }, { "type": "choice", "name": "category", "instructions": "Which category does this ticket belong to?", "choices": [ { "value": "billing", "description": "Charges and refunds" }, { "value": "bug", "description": "Product issue" }, { "value": "other", "description": "Other" } ] }, { "type": "score", "name": "urgency", "instructions": "How quickly does a human need to respond?", "levels": [ { "label": "low", "description": "Within a week is fine" }, { "label": "medium", "description": "Should respond soon" }, { "label": "high", "description": "Must respond today" } ] } ] }'

Format de la réponse

{ "model": "typesafe/jev-latest", "answers": [ { "type": "predicate", "name": "is_frustrated", "probability": 0.97 }, { "type": "choice", "name": "category", "choice": "billing", "confidence": 1, "probabilities": [ { "value": "billing", "probability": 1 }, { "value": "bug", "probability": 0 }, { "value": "other", "probability": 0 } ] }, { "type": "score", "name": "urgency", "score": 2, "confidence": 1, "legend": { "0": "low: Within a week is fine", "1": "medium: Should respond soon", "2": "high: Must respond today" }, "probabilities": [ { "value": 0, "label": "low", "probability": 0 }, { "value": 1, "label": "medium", "probability": 0 }, { "value": 2, "label": "high", "probability": 1 } ] } ], "usage": { "prompt_tokens": 407, "completion_tokens": 72, "total_tokens": 479 } }

answers correspond un à un à questions, dans le même ordre. Champs de chaque type de réponse :

TypeChampDescription
predicateprobabilityProbabilité que la réponse soit oui, de 0 à 1
choicechoiceL’option dont la probabilité est la plus élevée
probabilitiesProbabilité de chaque option ; la somme vaut 1
confidenceDegré de certitude du modèle pour cette décision, de 0 à 1 ; voir Probabilité et confiance
scorescoreValeur de niveau pondérée par les probabilités, à partir de 0. Elle peut se situer entre deux niveaux (par exemple 1.43)
legendCorrespondance entre l’indice de niveau et sa description
probabilitiesProbabilité de chaque niveau
confidenceComme ci-dessus

Format natif TypeSafe : /typesafe/v1/systemone

Les formats de requête et de réponse sont identiques à ceux de l’API officielle TypeSafe  : vous pouvez utiliser directement le SDK TypeSafe ou migrer du code existant. Par rapport au format unifié, les différences sont les suivantes :

Format unifié /v1/decisionsFormat natif TypeSafe
Contenu à évaluerinputstate
QuestionsTableau, identifiées par nameObjet, dont chaque clé est l’ID de la question
Questions oui/nontype: "predicate", champ de réponse probabilitytype: "noul", champ de réponse noul
Options et niveauxTableaux choices / levelsLes deux vont dans criteria : un objet {option: description} pour choice, un tableau de chaînes de description pour score
Champs d’utilisationprompt_tokens / completion_tokensinput_tokens / output_tokens
Terminal
curl https://api.ofox.ai/typesafe/v1/systemone \ -H "Authorization: Bearer $OFOX_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "jev-latest", "state": "Help! My payouts have been failing for 3 days.", "questions": { "is_urgent": { "type": "noul", "instructions": "Does this convey urgency?" }, "department": { "type": "choice", "instructions": "Which team should handle this?", "criteria": { "billing": "Payments, invoicing, refunds", "technical": "Bugs, outages, integrations", "sales": "Pricing, upgrades" } }, "frustration": { "type": "score", "instructions": "How frustrated is the customer?", "criteria": ["Calm", "Frustrated", "Very angry"] } } }'
{ "model": "typesafe/jev-latest", "answers": { "is_urgent": { "type": "noul", "noul": 0.95 }, "department": { "type": "choice", "choice": "billing", "confidence": 0.85, "probabilities": { "billing": 0.9, "technical": 0.1, "sales": 0 } }, "frustration": { "type": "score", "score": 1.03, "confidence": 0.95, "legend": { "0": "Calm", "1": "Frustrated", "2": "Very angry" }, "probabilities": { "0": 0, "1": 0.97, "2": 0.03 } } }, "usage": { "input_tokens": 399, "output_tokens": 73 } }

Intégration SDK

SDK OpenAI

Le SDK officiel d’OpenAI fournit client.decisions.create(). Faites pointer base_url vers https://api.ofox.ai/v1 et utilisez le format unifié pour le corps de la requête. Un exemple figure dans l’onglet Python ci-dessus. Il faut une version du SDK incluant la Decisions API (testé avec openai Python 3.31.0).

SDK TypeSafe

Avec le SDK officiel TypeSafe, définissez base_url sur https://api.ofox.ai/typesafe et remplacez api_key par votre clé API OfoxAI. Le reste du code reste inchangé :

typesafe_sdk.py
# pip install typesafe-sdk import os from typesafe_sdk import TypeSafeClient, Noul, Choice, Score with TypeSafeClient(base_url="https://api.ofox.ai/typesafe", api_key=os.environ["OFOX_API_KEY"]) as client: r = client.system_one( model="jev-latest", state={"message": "I was charged twice, nobody has answered my two emails, and I need a refund today."}, questions={ "urgent": Noul(instructions="Is the customer asking for this to be handled today?"), "dept": Choice( instructions="Which team should handle this?", criteria={"billing": "Charges, invoices, refunds", "technical": "Bugs, integrations", "sales": "Pricing, upgrades"}, ), "anger": Score(instructions="How upset is the customer?", criteria=["Calm", "Upset but polite", "Very angry"]), }, ) print(r.nouls["urgent"].noul) # 0.98 print(r.choices["dept"].choice) # billing print(r.scores["anger"].score) # 1.56

Probabilité et confiance

  • La probabilité répond à la question « quelle est la réponse » : probability et probabilities sont les probabilités calibrées du modèle pour chaque réponse possible.
  • La confiance répond à la question « peut-on se fier à cette décision » : confidence est dérivée de la distribution de probabilités et augmente à mesure que la distribution est concentrée. Si deux options sont chacune à 0.5, choice en renvoie tout de même une, mais confidence sera faible.

Une pratique courante consiste à définir un seuil dans le code : agir automatiquement lorsque la confiance est élevée, et transmettre à un humain ou à un modèle plus puissant pour vérification lorsqu’elle est faible.

Facturation

La facturation se fait au token ; les tarifs figurent sur la page du modèle . typesafe/jev-latest ne facture que les tokens d’entrée ; la sortie n’est pas facturée (completion_tokens / output_tokens sont tout de même renvoyés).

Toutes les questions d’une requête partagent la même entrée : regrouper plusieurs questions dans une seule requête est donc nettement moins coûteux et plus rapide que de les répartir sur des appels distincts.

Limites

ÉlémentLimite
Corps de la requête32 MiB au maximum
Contexte64K tokens pour Jev ; au-delà, l’API renvoie 400
Options de choice255 au maximum
Niveaux de scoreDe 2 à 10
Imbrication JSON64 niveaux au maximum pour chacun de input/state, instructions et criteria
StreamingNon pris en charge

Erreurs courantes

HTTP · typeMessage d’erreurCauseSolution
400 invalid_request_errorquestion "a" has kind choice and requires criteria optionsUne question choice n’a pas de choicesAjoutez le tableau d’options
400 invalid_request_errorquestion name "a" is used more than onceDeux questions partagent le même nameUtilisez des noms uniques
400 invalid_request_errorToo many score levels. Must have at most 10 levels.Une question score comporte plus de 10 niveauxFusionnez des niveaux, ou répartissez sur plusieurs questions
400 invalid_request_errordecision input carries an "input_image" part, which Typesafe cannot readUne image a été envoyée à JevRetirez l’image, ou utilisez un modèle capable de lire les images
400 invalid_request_errorInvalid request payloadLe format natif TypeSafe (state + questions sous forme d’objet) a été envoyé à /v1/decisionsPassez au format unifié, ou appelez plutôt /typesafe/v1/systemone
400 endpoint_not_supportedModel 'openai/gpt-4o' does not support the /v1/decisions endpoint on this platform.Le modèle n’est pas un modèle de décisionUtilisez l’un des modèles disponibles
404 model_not_foundModel 'typesafe/jev-9' not foundID de modèle erronéUtilisez typesafe/jev-latest
404 invalid_request_errorUnsupported API endpoint.Le chemin a été écrit /v1/systemoneL’endpoint du format natif TypeSafe est /typesafe/v1/systemone

Pour les autres erreurs générales, consultez Gestion des erreurs.

Dernière mise à jour le