Guide JavaScript

OpenAI Decisions API en JavaScript

OpenAI n'a pas publié de SDK pour sa Decisions API — il n'y a pas de client.decisions.create à copier. Cette page montre du JavaScript fonctionnel pour l'endpoint de ce site — une alternative appelable à l'OpenAI Decisions API qui sert decisions-1 et suit le même motif de décision contrainte.

Mis à jour

Faire l'appel

Un POST vers /api/v1/decisions avec une clé Bearer. Le corps est model, state et questions — 1 à 6 questions, chacune de type noul, choice ou score. Définissez DECISIONS_API_KEY avec une clé du tableau de bord.

Utilisez fetch — la même API dans Node 18+, Deno et les navigateurs. Mettez un timeout sur chaque appel (AbortSignal.timeout) : une décision bloquée doit échouer vite, pas figer le 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)

Lire les probabilités

answers revient indexé par vos ids de questions. Une réponse noul est la probabilité que l'énoncé soit vrai. Une réponse choice porte le choice gagnant, une probabilité par option et une valeur de confiance — utilisez la confiance, pas seulement le gagnant, pour décider d'agir automatiquement.

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 et retries

429 et 502 méritent un retry court avec backoff — les appels échoués ne sont pas facturés. 402 signifie solde vide : rechargez, ne réessayez pas. 422 est une erreur de validation ; le message nomme le champ, corrigez donc le corps plutôt que de réessayer.

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

Encapsulez l'appel dans un helper

L'appelant doit voir une fonction qui prend du texte et renvoie une étiquette — pas les détails HTTP. Mettez le timeout, le test du 402 et la boucle de retry dans decide() une fois, et chaque point d'appel reste propre.

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

FAQ

Existe-t-il un exemple officiel du SDK OpenAI pour la Decisions API ?

Non. OpenAI n'a publié ni méthodes SDK ni schéma de requête pour sa Decisions API — tout code montrant client.decisions.create est inventé. Cette page utilise du HTTP simple.

Puis-je utiliser axios ou un autre client HTTP au lieu de fetch ?

Oui — l'endpoint est un simple POST HTTPS. Axios, undici ou got fonctionnent pareil ; gardez le timeout et la gestion de statut identiques.

Comment envoyer un contexte structuré ?

state accepte un objet JSON ou un tableau, pas seulement une chaîne — passez des dicts directement dans le corps json et le modèle les lit comme contexte.

Lancez une décision depuis le navigateur

Aucune configuration — exécutez un vrai appel dans le bac à sable avec 1 crédit offert aux nouveaux visiteurs.