Guia JavaScript

OpenAI Decisions API em JavaScript

A OpenAI não publicou um SDK para sua Decisions API — não existe client.decisions.create para copiar. Esta página mostra JavaScript funcional para o endpoint deste site — uma alternativa chamável à OpenAI Decisions API que serve decisions-1 e segue o mesmo padrão de decisão restrita.

Atualizado

Faça a chamada

Um POST para /api/v1/decisions com uma chave Bearer. O corpo é model, state e questions — 1 a 6 perguntas, cada uma de tipo noul, choice ou score. Defina DECISIONS_API_KEY com uma chave do painel.

Use fetch — a mesma API em Node 18+, Deno e navegadores. Mantenha timeout em toda chamada (AbortSignal.timeout); uma decisão travada deve falhar rápido, não travar o 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)

Leia as probabilidades

answers volta indexada pelos seus ids de pergunta. Uma resposta noul é a probabilidade de a afirmação ser verdadeira. Uma resposta choice traz o choice vencedor, uma probabilidade por opção e um valor de confiança — use a confiança, não só o vencedor, para decidir se age automaticamente.

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 e tentativas

429 e 502 merecem uma tentativa curta com backoff — chamadas que falham não são cobradas. 402 significa saldo vazio: recarregue, não tente de novo. 422 é erro de validação; a mensagem indica o campo, então corrija o corpo em vez de tentar de novo.

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

Embrulhe a chamada num helper

Quem chama deve ver uma função que recebe texto e devolve um rótulo — não detalhes de HTTP. Coloque o timeout, a checagem de 402 e o loop de retry dentro de decide() uma vez só, e cada ponto de chamada fica limpo.

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

Perguntas frequentes

Existe um exemplo oficial do SDK da OpenAI para a Decisions API?

Não. A OpenAI não publicou métodos de SDK nem um esquema de requisição para sua Decisions API — qualquer código com client.decisions.create é inventado. Esta página usa HTTP puro.

Posso usar axios ou outro cliente HTTP em vez de fetch?

Sim — o endpoint é um simples POST HTTPS. Axios, undici ou got funcionam igual; mantenha o timeout e o tratamento de status idênticos.

Como envio contexto estruturado?

state aceita um objeto JSON ou array, não só string — passe dicts diretamente no corpo json e o modelo os lê como contexto.

Execute uma decisão no navegador

Sem configuração — rode uma chamada real no playground com 1 crédito grátis para novos visitantes.