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')

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.

JavaScript

// Keep the call behind one function — timeouts, 402s,
// and retries live inside it, not at every call site.
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.

¿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 1 crédito gratis para visitantes nuevos.