Untuk menggunakan OpenAI Decisions API, kirimkan permintaan POST ke https://api.openai.com/v1/decisions dengan "model": "gpt-6-luna", sebuah input (teks, gambar, atau keduanya), dan array questions di mana setiap pertanyaan adalah predicate, choice, atau score. Anda akan mendapatkan kembali jawaban bertipe dengan probabilitas alih-alih teks untuk diurai, dan Anda membayar $0,10 per 1 Juta token input, tanpa biaya output, baca-cache, atau tulis-cache. Endpoint ini dalam versi beta publik per 6 Oktober 2026.
Panduan ini mencakup cara mendapatkan kunci, panggilan pertama di curl, Python, dan JavaScript, membaca setiap jenis jawaban, tiga pertanyaan pada satu tiket dukungan, input gambar, ambang batas, dan pengaturan pengujian di Apidog. Untuk kapan memilih endpoint sama sekali, mulailah dengan apa itu OpenAI Decisions API.
Sekilas Permintaan Decisions API
| Bidang | Apa yang dibutuhkan |
|---|---|
model |
gpt-6-luna (satu-satunya model yang tersedia dalam beta) |
input |
Sebuah string, atau array pesan user yang content-nya adalah string atau bagian-bagian bertipe input_text dan input_image |
questions[].type |
predicate, choice, atau score |
questions[].instructions |
Wajib; pertanyaan dalam kata-kata biasa |
questions[].name |
Opsional; dikembalikan dalam jawaban (null jika dihilangkan) |
questions[].choices |
Hanya choice; 2 hingga 255 objek {value, description} unik, value berupa string atau boolean |
questions[].levels |
Hanya score; objek {label, description} yang berurutan, terendah dahulu, indeks mulai dari 0 |
safety_identifier |
ID pengguna akhir buram opsional, hingga 128 karakter |
Sumber: referensi Decisions API. Tidak ada temperature, stream, tools, atau text.format pada endpoint ini.
Dapatkan kunci dan lakukan panggilan pertama
Buat kunci di dashboard OpenAI ( panduan kunci OpenAI API membahasnya), ekspor sebagai OPENAI_API_KEY, dan jangan pernah menempelkannya ke dalam kode. Kemudian ajukan satu pertanyaan ya/tidak:
curl https://api.openai.com/v1/decisions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-6-luna",
"input": "The box arrived crushed and the screen is cracked.",
"questions": [
{"type": "predicate", "name": "damaged",
"instructions": "Does the customer report a damaged item?"}
]
}'
Respons memiliki tiga bidang tingkat atas: model, answers, dan usage. Ini adalah bentuk dari referensi OpenAI, dengan output_tokens pada 0 karena endpoint tidak menagih output:
{
"model": "gpt-6-luna",
"answers": [
{"type": "predicate", "name": "damaged", "probability": 0.95}
],
"usage": {
"input_tokens": 42,
"input_tokens_details": {"cached_tokens": 0, "cache_write_tokens": 0},
"output_tokens": 0,
"output_tokens_details": {"reasoning_tokens": 0},
"total_tokens": 42
}
}
Panggilan yang sama di Python (SDK 3.26.0 atau lebih baru):
from openai import OpenAI
client = OpenAI() # reads OPENAI_API_KEY from the environment
decision = client.decisions.create(
model="gpt-6-luna",
input="The box arrived crushed and the screen is cracked.",
questions=[
{"type": "predicate", "name": "damaged",
"instructions": "Does the customer report a damaged item?"}
],
)
print(decision.answers[0].probability)
Dan di JavaScript (SDK 7.30.0 atau lebih baru):
import OpenAI from "openai";
const client = new OpenAI();
const decision = await client.decisions.create({
model: "gpt-6-luna",
input: "The box arrived crushed and the screen is cracked.",
questions: [
{ type: "predicate", name: "damaged",
instructions: "Does the customer report a damaged item?" },
],
});
console.log(decision.answers[0].probability);
Baca jawaban berdasarkan jenis
Jawaban kembali dalam urutan pertanyaan Anda, masing-masing dengan type. Ganti berdasarkan jenis, karena setiap pertanyaan dapat kembali sebagai refusal.
predicatemengembalikanprobability, perkiraan dari 0 hingga 1 bahwa kondisi tersebut benar.choicemengembalikanchoice(valueyang menang),probabilitiessebagai array objek{value, probability}, danconfidence.scoremengembalikanscore,probabilitiessebagai array objek{value, label, probability}(di manavalueadalah indeks level berbasis 0), danconfidence. Skor adalah rata-rata tertimbang probabilitas dari indeks level, sehingga dapat berada di antara level: 1.1 berarti "antara level 1 dan level 2, dekat dengan 1".refusalhanya mengembalikantypedanname. Model menolak pertanyaan itu; pertanyaan lain dalam permintaan yang sama masih dapat menerima jawaban.
for a in decision.answers:
if a.type == "refusal":
send_to_review(a.name)
elif a.type == "predicate":
flag = a.probability > 0.9
elif a.type == "choice":
route = a.choice if a.confidence > 0.8 else "review"
elif a.type == "score":
priority = round(a.score)
Panduan OpenAI menarik garis seperti ini: choice untuk kategori tanpa urutan, seperti departemen; score untuk level berurutan, seperti tingkat keparahan.
Tiga pertanyaan pada satu tiket dukungan
Pertanyaan independen berbagi satu permintaan dan satu input, dan setiap pertanyaan dapat menggunakan jenis yang berbeda. Berikut adalah predikat, pilihan, dan skor pada satu tiket:
{
"model": "gpt-6-luna",
"input": "I was charged twice for my order.",
"questions": [
{"type": "predicate", "name": "refund_requested",
"instructions": "Is the customer asking for money back?"},
{"type": "choice", "name": "department",
"instructions": "Which team should handle this ticket?",
"choices": [
{"value": "billing", "description": "Charges, refunds, invoices"},
{"value": "technical", "description": "Bugs and errors in the product"},
{"value": "shipping", "description": "Delivery and tracking"},
{"value": "other", "description": "Anything else"}
]},
{"type": "score", "name": "urgency",
"instructions": "How urgent is this ticket?",
"levels": [
{"label": "low", "description": "No time pressure"},
{"label": "medium", "description": "Needs a reply this week"},
{"label": "high", "description": "Customer is blocked or losing money"}
]}
]
}
Array answers kembali dalam urutan yang sama. Nilai choice di bawah adalah nilai panduan OpenAI untuk input yang persis sama ini; nilai predikat dan skor adalah ilustrasi:
"answers": [
{"type": "predicate", "name": "refund_requested", "probability": 0.88},
{"type": "choice", "name": "department", "choice": "billing",
"probabilities": [
{"value": "billing", "probability": 0.95},
{"value": "technical", "probability": 0.02},
{"value": "shipping", "probability": 0.01},
{"value": "other", "probability": 0.02}
],
"confidence": 0.93},
{"type": "score", "name": "urgency", "score": 1.6,
"probabilities": [
{"value": 0, "label": "low", "probability": 0.05},
{"value": 1, "label": "medium", "probability": 0.30},
{"value": 2, "label": "high", "probability": 0.65}
],
"confidence": 0.65}
]
Dua aturan dari panduan: sertakan cadangan seperti other ketika kategori Anda tidak mencakup setiap input, dan tulis pertanyaan berdasarkan kriteria yang dapat diamati sehingga level skor yang berdekatan memiliki arti yang berbeda. Jika keputusan kedua bergantung pada jawaban pertama, kirimkan permintaan terpisah.
Input gambar
Lewatkan gambar sebagai bagian konten di dalam pesan user. Panduan ini mendokumentasikan URL data base64 sebaris:
{
"model": "gpt-6-luna",
"input": [{
"role": "user",
"content": [
{"type": "input_text", "text": "Photo attached to a return request."},
{"type": "input_image", "image_url": "data:image/jpeg;base64,/9j/4AAQ..."}
]
}],
"questions": [
{"type": "predicate", "name": "visible_damage",
"instructions": "Is the product visibly damaged?"}
]
}
Referensi API juga mencantumkan URL HTTP(S) yang dapat diakses publik, hingga 128 gambar di semua pesan dalam satu permintaan, dan bidang detail opsional (low, high, auto, original), jadi uji URL yang di-host terhadap akun Anda sendiri sebelum mengandalkannya. Input file_id tidak didukung di kedua halaman.
Pilih ambang batas dari contoh berlabel
OpenAI tidak menerbitkan angka akurasi atau kalibrasi untuk endpoint. Panduannya adalah menggunakan contoh berlabel dari aplikasi Anda sendiri untuk menetapkan ambang batas untuk perutean, pemfilteran, atau peninjauan, berdasarkan biaya positif palsu versus negatif palsu. Dalam praktiknya, itu berarti CSV kecil dari tiket nyata dengan departemen yang dipilih oleh manusia, dijalankan melalui permintaan yang sama, sehingga Anda dapat melihat di mana confidence memisahkan rute bersih dari yang membutuhkan orang. Bagian selanjutnya membangun loop itu.
Uji Decisions API di Apidog
Permintaan yang disimpan membuat penyetelan ambang batas dan pemeriksaan regresi dapat diulang. Berikut pengaturannya di Apidog:
- Simpan kunci sebagai variabel lingkungan. Buat lingkungan, tambahkan
OPENAI_API_KEYsebagai variabel rahasia (Lingkungan Apidog dan variabel rahasia menunjukkan pengaturannya), dan atur headerAuthorizationkeBearer {{OPENAI_API_KEY}}. Kunci tidak pernah masuk ke isi permintaan bersama. - Simpan satu permintaan per jenis pertanyaan. Buat POST ke
https://api.openai.com/v1/decisionsdenganContent-Type: application/json, tempel pertanyaanchoicedari contoh tiket di atas secara terpisah, dan simpan. Gandakan untuk versi predikat dan skor. - Tambahkan pernyataan JSONPath. Pada permintaan pilihan: status adalah 200,
$.answers[0].typesama denganchoice,$.answers[0].choicesama denganbilling,$.answers[0].confidencelebih besar dari 0.8, dan$.usage.output_tokenssama dengan 0. Untuk predikat kerusakan, nyatakan$.answers[?(@.name=='damaged')].probabilitylebih besar dari 0.9. Perubahan kata dalam instruksi Anda, atau perubahan perilaku model, sekarang menggagalkan pengujian alih-alih salah mengarahkan tiket. - Jalankan di atas tiket berlabel. Bangun skenario pengujian dari permintaan yang disimpan dan lampirkan CSV kecil dengan dua kolom,
ticket_textdanexpected_department. Petakan{{ticket_text}}ke dalaminputdan nyatakan$.answers[0].choicesama dengan{{expected_department}}. Laporan jalankan menunjukkanconfidenceuntuk setiap baris, yang merupakan data yang OpenAI katakan kepada Anda untuk menetapkan ambang batasnya. Titik di bawah mana setiap rute yang salah berada menjadi ambang batas "rute otomatis" Anda dalam kode. - Mengejek array
answersuntuk frontend. Arahkan router atau UI ke mock dari endpoint yang sama yang mengembalikan jawabanchoicedenganconfidencedi atas dan di bawah ambang batas Anda, ditambahrefusal, sehingga jalur antrean peninjauan dibangun sebelum Anda menghabiskan token input. Respons mock bersyarat di Apidog membahas pengalihan mock pada konten permintaan. - Jalankan skenario di CI. Ekspor token akses, lalu tambahkan langkah ke pipeline Anda:
apidog run --access-token "$APIDOG_ACCESS_TOKEN" \
-t "$SCENARIO_ID" -e "$ENV_ID" -r cli,junit
Pernyataan yang gagal menggagalkan build, jadi penurunan confidence yang tenang tertangkap sebelum deploy daripada di antrean dukungan. Untuk pola yang lebih luas, lihat pengujian aplikasi LLM.
Tangani kesalahan dan kasus tepi
- 429 batas laju terlampaui. Tidak ada batas spesifik Decisions yang dipublikasikan; periksa Pengaturan > Organisasi > Batas untuk angka Anda. Mundur secara eksponensial dan hormati header
Retry-Afterjika ada. Panduan batas laju terlampaui memiliki pembungkus coba lagi. - Jawaban penolakan. Perlakukan
type: "refusal"sebagai hasil perutean, bukan pengecualian. Kirim tiket itu ke manusia dan simpan jawaban lain dari permintaan yang sama. - Keputusan yang bergantung. Setiap pertanyaan dievaluasi secara independen terhadap input bersama. Apa pun yang bergantung pada jawaban sebelumnya membutuhkan permintaannya sendiri.
FAQ
Berapa biaya Decisions API? $0.10 per 1 Juta token input pada gpt-6-luna, tanpa biaya output, baca-cache, atau tulis-cache. Tiket 500 token dengan tiga pertanyaan berharga 500 / 1.000.000 x $0.10 = $0.00005, jadi satu juta tiket semacam itu berharga $50. Input konteks panjang lebih dari 272K token adalah 2x, dan pemrosesan regional menambahkan 10%.
Apakah Decisions API gratis? Tidak. Tidak ada tingkatan Decisions gratis. Jika Anda ingin mencoba GPT-6 Luna tanpa membayar, posting rute gratis GPT-6 Luna mencantumkan apa yang ada.
Seberapa cepat itu? OpenAI mengatakan sekitar 10x lebih cepat daripada Responses API dan tidak mempublikasikan angka latensi absolut. Seorang pengembang di forum OpenAI melaporkan keputusan gambar dalam sekitar 0,8 detik.
Model mana yang berfungsi dengan Decisions API? Hanya gpt-6-luna hari ini. Ini adalah endpoint di Luna, bukan model terpisah. Lihat apa itu GPT-6 Luna untuk model itu sendiri.
Kapan saya harus menggunakan Output Terstruktur sebagai gantinya? Ketika Anda memerlukan objek dalam skema JSON Anda sendiri, seperti bidang yang diekstraksi atau penjelasan tertulis, atau panggilan fungsi ketika model harus meminta alat dengan argumen. Posting Decisions API vs Responses API menunjukkan tiket yang sama dilakukan dengan kedua cara.
Bagaimana perbandingannya dengan Jev? Keduanya mengembalikan jawaban bertipe dengan probabilitas dan hanya menagih input; Jev hanya teks dengan biaya $0,042 per 1 Juta. Perbandingan Decisions API vs Jev memiliki tabel lengkap.
Langkah selanjutnya
Kirimkan permintaan tiket tiga pertanyaan dari panduan ini, lalu jalankan di atas 20 tiket berlabel Anda sendiri dan lihat di mana confidence memisahkan rute yang benar dari yang salah. Kemudian unduh Apidog untuk menyimpan permintaan, skenario CSV, dan pernyataan bersama, sehingga ambang batas yang Anda pilih hari ini diperiksa ulang pada setiap penyebaran.
