Decisions API
La Decisions API permite que un modelo tome decisiones tipadas sobre un contenido en lugar de generar texto. Usted proporciona el contenido que se debe evaluar y un conjunto de preguntas, y el modelo devuelve una respuesta estructurada para cada una: la probabilidad de sí o no, una única elección entre una lista de opciones o una puntuación en una escala graduada, junto con las probabilidades de cada opción y un valor de confianza.
Está pensada para clasificación, enrutamiento, moderación, puntuación, filtrado y cualquier otro caso en el que su código deba bifurcarse directamente según el resultado. El modelo solo puede responder con las opciones y los niveles que usted define, nunca con nada fuera de ellos, por lo que no hay texto libre que analizar.
Si es la primera vez que utiliza un modelo de decisión, se recomienda leer primero la guía de uso de Jev, que incluye el inicio rápido, el diseño de preguntas, la interpretación de los resultados y ejemplos de escenarios. Esta página es la referencia a nivel de campos.
Endpoints
Los tres endpoints sirven los mismos modelos con la misma facturación; solo cambia el formato de la petición y de la respuesta. Elija el que corresponda a su cliente:
La autenticación es la misma que en los demás endpoints: Authorization: Bearer <su OFOXAI_API_KEY>. Solo se admiten peticiones sin streaming; cada petición devuelve todas las respuestas de forma síncrona.
Modelos disponibles
La lista completa de modelos compatibles con esta API está en la página de modelos . Una llamada con un modelo de chat convencional (como openai/gpt-4o) devuelve endpoint_not_supported.
Formato unificado: /v1/decisions
Parámetros de la petición
Formato de entrada
input admite tres formas:
- Texto: una única cadena.
"input": "Customer message: I was charged twice, nobody has answered my two emails, and I need a refund today." - Datos estructurados: un objeto JSON que se pasa al modelo tal cual. Las preguntas pueden referirse a nombres de campo entre comillas invertidas, como
`message`."input": { "ticket_id": 4812, "message": "I was charged twice.", "plan": "pro" } - Array de mensajes:
[{ "role", "content" }], dondecontentes una cadena o una lista de bloques de contenido. Solo se admiten los bloquesinput_texteinput_image. Las imágenes solo funcionan con modelos capaces de leerlas. Jev no lee imágenes; enviar una devuelve 400.
Objeto de pregunta
Ejemplos de petición
cURL
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" }
]
}
]
}'Formato de la respuesta
{
"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 se corresponde uno a uno con questions, en el mismo orden. Campos de cada tipo de respuesta:
Formato nativo de TypeSafe: /typesafe/v1/systemone
Los formatos de petición y respuesta coinciden con los de la API oficial de TypeSafe , por lo que puede usar directamente el SDK de TypeSafe o migrar código existente. Respecto al formato unificado, las diferencias son:
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 }
}Integración con SDK
SDK de OpenAI
El SDK oficial de OpenAI ofrece client.decisions.create(). Configure base_url como https://api.ofox.ai/v1 y use el formato unificado para el cuerpo de la petición. Hay un ejemplo en la pestaña Python de más arriba. Necesita una versión del SDK que incluya la Decisions API (probado con openai Python 3.31.0).
SDK de TypeSafe
Con el SDK oficial de TypeSafe, configure base_url como https://api.ofox.ai/typesafe y sustituya api_key por su API Key de OfoxAI. El resto del código no cambia:
Python
# 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.56Probabilidad y confianza
- La probabilidad responde a «cuál es la respuesta»:
probabilityyprobabilitiesson las probabilidades calibradas del modelo para cada respuesta posible. - La confianza responde a «se puede confiar en esta decisión»:
confidencese deriva de la distribución de probabilidades y es más alta cuanto más concentrada está la distribución. Si dos opciones quedan cada una en 0.5,choicedevuelve igualmente una de ellas, peroconfidenceserá baja.
Una práctica habitual es fijar un umbral en el código: actuar automáticamente cuando la confianza es alta, y derivar a una persona o a un modelo más potente para su revisión cuando es baja.
Facturación
La facturación es por token; las tarifas están en la página del modelo . typesafe/jev-latest solo factura los tokens de entrada; la salida no se factura (completion_tokens / output_tokens se siguen devolviendo).
Todas las preguntas de una petición comparten la misma entrada, por lo que incluir varias preguntas en una sola petición es mucho más barato y rápido que repartirlas en llamadas separadas.
Límites
Errores habituales
Para otros errores generales, consulte Gestión de errores.