TypeScript rehberi

TypeScript'te OpenAI Decisions API

OpenAI, Decisions API'si için bir SDK yayınlamadı — kopyalanacak client.decisions.create yok. Bu sayfa, bu sitenin uç noktası için çalışan, tamamen tiplenmiş TypeScript gösterir — decisions-1 sunan ve aynı kısıtlı karar örüntüsünü izleyen, çağrılabilir bir OpenAI Decisions API alternatifi.

Güncellendi

Sözleşmeyi tanımlayın

İsteği bir kez tipleştirin ve her yerde kullanın. model bir literal union'dır, sabit ID asla yazım hatasına dönüşmez. questions, kimliklerinizle anahtarlanmış bir record'dur; her biri noul, choice veya score tipindedir.

Yanıtları type üzerinden ayrıştırılmış bir union olarak tipleştirin — yanıt işlemeyi güvenli yapan budur: noul yanıtında noul, choice yanıtında choice ve probabilities vardır — type'a göre daraltmak doğru alanları verir.

TypeScript

interface DecisionQuestion {
  type: 'noul' | 'choice' | 'score'
  instructions: string
  criteria?: Record<string, string> | string[]
}

interface DecisionRequest {
  model: 'decisions-1' | 'decisions-latest'
  state: string | Record<string, unknown> | unknown[]
  questions: Record<string, DecisionQuestion>
}

interface DecisionAnswers {
  [questionId: string]:
    | { type: 'noul'; noul: number }
    | { type: 'choice'; choice: string; probabilities: Record<string, number>; confidence: number }
    | { type: 'score'; score: number; legend: string[]; probabilities: Record<string, number>; confidence: number }
}

Çağrıyı yapın

Bearer anahtarıyla tek POST. satisfies DecisionRequest gövdeyi derleme zamanında denetler; AbortSignal.timeout takılan çağrıların pipeline'ı kilitlemesini önler. answers'ı okumadan önce type alanına göre daraltın.

TypeScript

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(request satisfies DecisionRequest),
  signal: AbortSignal.timeout(30000),
})
const { answers } = (await res.json()) as { answers: DecisionAnswers }

const team = answers.team
if (team.type === 'choice' && team.confidence >= 0.7) {
  routeTo(team.choice)
}

Timeout'lar ve yeniden denemeler

429 ve 502 kısa bir backoff denemesini hak eder — başarısız çağrılar ücretlendirilmez. 402 bakiyenin boş olduğu anlamına gelir: yükleyin, tekrar denemeyin. 422 doğrulama hatasıdır; mesaj alanı belirtir, yani tekrar denemek yerine gövdeyi düzeltin.

TypeScript

async function decide(body: DecisionRequest, attempts = 3): Promise<DecisionAnswers> {
  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() as { answers: DecisionAnswers }).answers
  }
  throw new Error('decision call failed')
}

Sağlayıcıyı tek fonksiyonun arkasında tutun

Çağıranlar, metin alıp etiket döndüren tipli bir fonksiyon görmeli — HTTP detaylarını değil. OpenAI Decisions API'sini açtığında decide() içeriğini değiştirirsiniz ve tüm çağrı noktaları aynı kalır. Soru metinleri, seçenekler ve eşikler korunur.

TypeScript

// Keep the decision behind one typed function. Swap the HTTP
// layer when OpenAI publishes its schema — callers never change.
export async function routeTicket(text: string): Promise<string> {
  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.type === 'choice' && team.confidence >= 0.7 ? team.choice : 'triage'
}

SSS

Decisions API için resmi bir OpenAI SDK örneği var mı?

Hayır. OpenAI, Decisions API'si için SDK metodları veya istek şeması yayımlamadı — client.decisions.create gösteren her şey uydurmadır. Bu sayfa düz HTTP kullanır; her sağlayıcı SDK'sı zaten bunu sarar.

Tipler için kod üreticisine ihtiyacım var mı?

Hayır — bu sayfadaki arayüzler tüm sözleşmeyi kapsıyor. Projenize kopyalayın; denetlenecek kadar küçük ve sağlayıcılar arasında stabildir.

Yapılandırılmış bağlamı nasıl gönderirim?

state yalnızca string değil, JSON objesi veya dizi de kabul eder — json gövdesinde doğrudan dict geçirin, model onu bağlam olarak okur.

Tarayıcıdan bir karar çalıştırın

Kurulum yok — yeni ziyaretçilere 1 ücretsiz krediyle oyun alanında gerçek bir çağrı yapın.