Guía de JavaScript
OpenAI Decisions API en JavaScript
OpenAI no ha publicado un SDK para su Decisions API — no hay ningún client.decisions.create que copiar. Esta página muestra JavaScript 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 fetch — la misma API en Node 18+, Deno y navegadores. Pon timeout en cada llamada (AbortSignal.timeout); una decisión colgada debe fallar rápido, no atascar el pipeline.
JavaScript
const res = await fetch('https://decisions-api.net/api/v1/decisions', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.DECISIONS_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
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?',
},
},
}),
})
const { answers } = await res.json()
console.log(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.
JavaScript
// noul: probability the statement is true
if (answers.refund.noul >= 0.8) routeToRefunds()
// choice: winning label + per-option probabilities + confidence
const team = answers.team
console.log(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.
JavaScript
async function decide(body, attempts = 3) {
for (let i = 0; i < attempts; i++) {
const res = await fetch('https://decisions-api.net/api/v1/decisions', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.DECISIONS_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(body),
signal: AbortSignal.timeout(30000),
})
if (res.status === 429 || res.status === 502) {
await new Promise(r => setTimeout(r, 2 ** i * 1000))
continue
}
if (res.status === 402) throw new Error('out of credits')
if (!res.ok) throw new Error(`decision call failed: ${res.status}`)
return (await res.json()).answers
}
throw new Error('decision call failed')Mantén el proveedor tras una función
Quien llama debería ver una función que toma texto y devuelve una etiqueta — no detalles HTTP. Cuando OpenAI abra su Decisions API cambias el interior de decide() y todos los puntos de llamada quedan igual. El texto de las preguntas, las opciones y los umbrales se conservan.
JavaScript
// Keep the decision behind one function. Swap the HTTP layer
// when OpenAI publishes its schema — callers never change.
export async function routeTicket(text) {
const answers = await 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.',
},
},
},
})
const team = answers.team
return team.confidence >= 0.7 ? team.choice : '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, que es lo que envolvería cualquier SDK de proveedor.
¿Puedo usar axios u otro cliente HTTP en lugar de fetch?
Sí — el endpoint es un simple POST HTTPS. Axios, undici o got funcionan igual; mantén el timeout y el manejo de estado idénticos.
¿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 2 créditos gratis para visitantes nuevos.