Руководство JavaScript

OpenAI Decisions API на JavaScript

OpenAI не публиковала SDK для своей Decisions API — нечего копировать, client.decisions.create не существует. На этой странице — рабочий JavaScript для эндпоинта этого сайта: вызываемой альтернативы OpenAI Decisions API, которая обслуживает decisions-1 и следует тому же паттерну ограниченных решений.

Обновлено

Выполните вызов

Один POST на /api/v1/decisions с Bearer-ключом. Тело — model, state и questions: от 1 до 6 вопросов типа noul, choice или score. Установите DECISIONS_API_KEY в ключ из панели.

Используйте fetch — один и тот же API в Node 18+, Deno и браузерах. Ставьте таймаут на каждый вызов (AbortSignal.timeout): зависшее решение должно быстро падать, а не останавливать конвейер.

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)

Чтение вероятностей

answers возвращается по вашим ID вопросов. Ответ noul — вероятность истинности утверждения. Ответ choice несёт победивший choice, вероятность для каждого варианта и значение уверенности — решайте об автоматическом действии по уверенности, а не только по победителю.

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)

Таймауты и ретраи

429 и 502 стоят короткого ретрая с backoff — неудачные вызовы не оплачиваются. 402 — пустой баланс: пополняйте, а не ретрайте. 422 — ошибка валидации; сообщение называет поле, так что чините тело, а не повторяйте.

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

Спрячьте провайдера за одной функцией

Вызывающий код должен видеть функцию «текст внутрь — метка наружу», а не детали HTTP. Когда OpenAI откроет свою Decisions API, вы замените внутренности decide(), а все точки вызова останутся прежними. Тексты вопросов, варианты и пороги сохраняются.

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

Частые вопросы

Есть ли официальный пример SDK OpenAI для Decisions API?

Нет. OpenAI не опубликовала ни методов SDK, ни схемы запроса для Decisions API — любой код с client.decisions.create выдуман. Эта страница использует чистый HTTP — ровно то, что оборачивал бы любой SDK провайдера.

Можно ли использовать axios или другой HTTP-клиент вместо fetch?

Да — эндпоинт это обычный HTTPS POST. Axios, undici или got работают так же; сохраните таймаут и обработку статусов идентичными.

Как отправить структурированный контекст?

state принимает JSON-объект или массив, а не только строку — передавайте dict прямо в json-теле, модель прочитает его как контекст.

Запустите решение из браузера

Без настройки — выполните настоящий вызов в песочнице с 2 бесплатными кредитами для новых посетителей.