Guía de Python
OpenAI Decisions API en Python
OpenAI no ha publicado un SDK para su Decisions API — no hay ningún client.decisions.create que copiar. Esta página muestra Python funcional para el endpoint de este sitio — una alternativa llamable a la OpenAI Decisions API que sirve decisions-1 y sigue el mismo patrón de decisión restringida.
Actualizado
Haz la llamada
Un POST a /api/v1/decisions con una clave Bearer. El cuerpo es model, state y questions — de 1 a 6 preguntas, cada una de tipo noul, choice o score. Define DECISIONS_API_KEY con una clave del panel.
Usa requests (o httpx para async — la forma de la llamada es idéntica). Pon timeout en cada llamada; una decisión colgada debe fallar rápido, no atascar el pipeline.
Python
import os
import requests
res = requests.post(
"https://decisions-api.net/api/v1/decisions",
headers={"Authorization": f"Bearer {os.environ['DECISIONS_API_KEY']}"},
json={
"model": "decisions-1",
"state": "I was charged twice for my subscription this morning.",
"questions": {
"refund": {
"type": "noul",
"instructions": "Is the customer asking for money back?",
}
},
},
timeout=30,
)
res.raise_for_status()
answers = res.json()["answers"]
print(answers["refund"]["noul"])Lee las probabilidades
answers vuelve indexado por tus ids de pregunta. Una respuesta noul es la probabilidad de que el enunciado sea cierto. Una respuesta choice lleva el choice ganador, una probabilidad por opción y un valor de confianza — usa la confianza, no solo el ganador, para decidir si actuar automáticamente.
Python
answers = res.json()["answers"]
# noul: probability the statement is true
if answers["refund"]["noul"] >= 0.8:
route_to_refunds()
# choice: winning label + per-option probabilities + confidence
team = answers["team"]
print(team["choice"], team["probabilities"], team["confidence"])Timeouts y reintentos
429 y 502 merecen un reintento corto con backoff — las llamadas fallidas no se cobran. 402 significa saldo vacío: recarga, no reintentes. 422 es un error de validación; el mensaje nombra el campo, así que corrige el cuerpo en lugar de reintentar.
Python
import time
import requests
def decide(body, attempts=3):
for i in range(attempts):
try:
res = requests.post(
"https://decisions-api.net/api/v1/decisions",
headers={"Authorization": f"Bearer {os.environ['DECISIONS_API_KEY']}"},
json=body,
timeout=30,
)
if res.status_code in (429, 502):
time.sleep(2 ** i)
continue
if res.status_code == 402:
raise RuntimeError("out of credits")
res.raise_for_status()
return res.json()["answers"]
except requests.Timeout:
time.sleep(2 ** i)
raise RuntimeError("decision call failed")Envuelve la llamada en un helper
Quien llama debería ver una función que toma texto y devuelve una etiqueta — no detalles HTTP. Pon el timeout, la comprobación de 402 y el bucle de reintentos dentro de decide() una sola vez y cada punto de llamada queda limpio.
Python
# Keep the call behind one function — timeouts, 402s,
# and retries live inside it, not at every call site.
def route_ticket(text: str) -> str:
answers = decide({
"model": "decisions-1",
"state": text,
"questions": {
"team": {
"type": "choice",
"instructions": "Which team should own this ticket?",
"criteria": {
"payments": "Checkout or billing.",
"frontend": "Rendering or browser behavior.",
"account": "Login or permissions.",
},
}
},
})
team = answers["team"]
return team["choice"] if team["confidence"] >= 0.7 else "triage"Preguntas frecuentes
¿Hay un ejemplo oficial del SDK de OpenAI para la Decisions API?
No. OpenAI no ha publicado métodos de SDK ni un esquema de petición para su Decisions API — cualquier cosa con client.decisions.create es inventada. Esta página usa HTTP plano.
¿Puedo usar httpx en lugar de requests?
Sí — el endpoint es un simple POST HTTPS. Usa httpx.AsyncClient con las mismas cabeceras, cuerpo, timeout y manejo de estado.
¿Cómo envío contexto estructurado?
state acepta un objeto JSON o un array, no solo una cadena — pasa dicts directamente en el cuerpo json y el modelo los lee como contexto.
Ejecuta una decisión desde el navegador
Sin configuración — ejecuta una llamada real en el playground con 1 crédito gratis para visitantes nuevos.