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')
}Çağrıyı bir helper'a sarın
Çağıranlar metin alıp etiket döndüren bir fonksiyon görmeli — HTTP ayrıntılarını değil. Zaman aşımını, 402 kontrolünü ve retry döngüsünü decide() içine bir kez koyun; her çağrı noktası temiz kalır.
TypeScript
// Keep the call behind one typed function — timeouts, 402s,
// and retries live inside it, not at every call site.
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.
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 kodunuzla birlikte sürümlenebilir.
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.