Keputusan
API OpenAI Decisions
Ajukan pertanyaan klasifikasi dan penilaian kepada GPT-6 Luna Decisions tentang teks, gambar, atau JSON, lalu dapatkan jawaban bertipe yang bisa langsung diproses kode Anda: seberapa besar kemungkinan suatu pernyataan benar, nilai mana dari daftar Anda yang paling cocok, atau posisinya pada skala Anda, masing-masing disertai probabilitasnya. Banyak pertanyaan dalam satu permintaan, biasanya selesai dalam waktu kurang dari satu detik, melalui Decisions API dan SDK resmi OpenAI.
/v1/decisionsGPT-6 Luna Decisions adalah model keputusan OpenAI. Model ini membaca input Anda dan menjawab pertanyaan yang Anda ajukan tentangnya, tanpa menulis teks, jadi bukan model chat: kirim ke /v1/decisions, bukan /v1/chat/completions. Di endpoint ini gpt-6-luna juga berfungsi sebagai ID model, seperti di dokumentasi SDK OpenAI, sehingga kode contoh OpenAI berjalan tanpa perubahan; model pada balasan berisi gpt-6-luna-decisions. Untuk Jev, model keputusan TypeSafe, lihat Keputusan (Jev).
Ajukan pertanyaan
# pip install --upgrade openaiimport osfrom openai import OpenAIclient = OpenAI( base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"],)decision = client.decisions.create( model="gpt-6-luna-decisions", input="My headphones stopped charging two days after they arrived. I want a refund.", questions=[ { "type": "predicate", "name": "refund", "instructions": "Is the customer asking for a refund?", }, { "type": "choice", "name": "topic", "instructions": "What is the ticket about?", "choices": [ {"value": "billing", "description": "Charges and invoices"}, {"value": "hardware", "description": "A device that is broken or faulty"}, {"value": "shipping", "description": "Delivery and tracking"}, ], }, { "type": "score", "name": "sentiment", "instructions": "How does the customer feel?", "levels": [ {"label": "very negative"}, {"label": "negative"}, {"label": "neutral"}, ], }, ],)# One answer per question, in the order askedfor answer in decision.answers: if answer.type == "refusal": print(answer.name, "refused") elif answer.type == "predicate": print(answer.name, answer.probability) elif answer.type == "choice": print(answer.name, answer.choice, answer.confidence) else: print(answer.name, answer.score, answer.confidence)print(decision.usage.input_tokens, "input tokens")Arahkan SDK OpenAI ke https://api.zurelay.com/v1, dengan /v1 seperti untuk setiap model OpenAI di Zurelay, gunakan kunci Zurelay Anda, lalu panggil client.decisions.create. Di Node.js diperlukan openai 7.30.0 atau lebih baru; di Python, diperlukan paket openai yang cukup baru untuk memiliki client.decisions (versi 3.41 sudah memilikinya). Klien HTTP apa pun bekerja dengan cara yang sama: POST JSON dengan kunci Anda sebagai Bearer token.
Jawaban
{ "id": "req_3Fh8sLq0vW2nTc7yRb5kZp1M", "model": "gpt-6-luna-decisions", "answers": [ { "type": "predicate", "name": "refund", "probability": 1 }, { "type": "choice", "name": "topic", "choice": "hardware", "confidence": 1, "probabilities": [ { "value": "billing", "probability": 0 }, { "value": "hardware", "probability": 1 }, { "value": "shipping", "probability": 0 } ] }, { "type": "score", "name": "sentiment", "score": 0.18, "confidence": 0.85, "probabilities": [ { "value": 0, "label": "very negative", "probability": 0.82 }, { "value": 1, "label": "negative", "probability": 0.18 }, { "value": 2, "label": "neutral", "probability": 0 } ] } ], "usage": { "input_tokens": 325, "input_tokens_details": { "cached_tokens": 0, "cache_write_tokens": 0 }, "output_tokens": 0, "output_tokens_details": { "reasoning_tokens": 0 }, "total_tokens": 325, "cost": 0.000013 }}answers berisi satu jawaban per pertanyaan, sesuai urutan pertanyaan Anda, masing-masing dengan type dan, jika Anda menyertakannya, name. usage adalah dasar penagihan permintaan: input_tokens, dengan output_tokens selalu 0, dan cost adalah biayanya dalam dolar AS. Header x-request-id pada balasan membantu Anda menemukannya di log permintaan, dan x-zurelay-input-tokens mengulang dasar penagihannya.
Parameter
modelstringwajibgpt-6-luna-decisions, ataugpt-6-lunapada endpoint ini.inputstring atau arraywajib- Hal yang akan diputuskan: teks yang tidak kosong, atau array pesan pengguna,
{ "role": "user", "content": ... }("type": "message"bersifat opsional).contentpada setiap pesan berupa teks atau array bagian, seperti di bawah ini. questionsarraywajib- 1 hingga 64 pertanyaan, dijawab sesuai urutan yang Anda tuliskan.
safety_identifierstring- Opsional: ID buram untuk pengguna akhir yang menjadi tujuan permintaan, misalnya hash dari ID pengguna Anda sendiri.
prompt_cache_keystring- Diterima tetapi diabaikan, begitu juga
prompt_cache_options: caching berjalan otomatis, dan setiap token input dikenai harga yang sama.
typestringwajibpredicate,choiceatauscore.instructionsstringwajib- Pertanyaannya berupa teks. Gambar dimasukkan di input, bukan di sini.
namestring- Opsional, dan harus unik dalam satu permintaan: nilainya dikembalikan pada jawaban pertanyaan tersebut, sehingga Anda dapat membaca jawaban berdasarkan nama.
choicesarray- Untuk
choice(wajib): 2 hingga 255 nilai, masing-masing{ "value": ..., "description": ... }. Nilai berupa teks atautrue/false, dan setiap nilai harus unik; deskripsi bersifat opsional. levelsarray- Untuk
score(wajib): 2 hingga 10 tingkat, dari yang terendah, masing-masing{ "label": ..., "description": ... }, deskripsi bersifat opsional.
input_text{ text }- Teks.
input_image{ image_url, detail }- Gambar PNG, JPEG, WebP, atau GIF: berupa data URL base64, atau tautan
httpspublik yang akan diunduh oleh Zurelay.detailbersifat opsional:low,high,auto, atauoriginal. input_json{ data }- Sebuah objek atau array, misalnya record atau state aplikasi Anda. Model membacanya sebagai teks JSON ringkas, dan dihitung sebagai teks tersebut.
Jenis pertanyaan
Satu permintaan dapat memadukan ketiganya. Input dibaca sekali untuk semuanya, sehingga mengajukan beberapa pertanyaan dalam satu permintaan lebih murah daripada mengajukan masing-masing dalam permintaan terpisah.
Predikat
Pernyataan atau pertanyaan ya/tidak tentang input. probability dari jawabannya menunjukkan seberapa besar kemungkinan pernyataan itu benar: mendekati 1 untuk ya, mendekati 0 untuk tidak, dan di antaranya jika input tidak menyatakannya dengan jelas.
{ "type": "predicate", "name": "refund", "instructions": "Is the customer asking for a refund?" }{ "type": "predicate", "name": "refund", "probability": 1 }Pilihan
Memilih salah satu nilai dari daftar yang Anda berikan, lalu menyertakan probabilitas masing-masing. Deskripsi menjelaskan arti suatu nilai, yang berguna ketika nilainya hanya berupa kode. Nilai juga bisa berupa true dan false, dan teks "true" serta boolean true dianggap sebagai nilai yang berbeda.
{ "type": "choice", "name": "language", "instructions": "Which language is the message written in?", "choices": [ { "value": "en", "description": "English" }, { "value": "es", "description": "Spanish" }, { "value": "other", "description": "Any other language" } ]}Skor
Menempatkan input pada tingkat-tingkat yang Anda tentukan, dari yang terendah. score adalah tingkat yang diharapkan: indeks setiap tingkat, dihitung mulai dari 0, dibobot menurut probabilitasnya. Jadi hasilnya bisa berada di antara dua tingkat: pada contoh respons di atas, 0.18 sebagian besar berada di tingkat pertama dengan sedikit pengaruh dari tingkat kedua. Setiap entri di probabilities memiliki indeks tingkat sebagai value dan label-nya.
{ "type": "score", "name": "relevance", "instructions": "How well does the passage answer the search query?", "levels": [ { "label": "irrelevant" }, { "label": "related", "description": "On the topic, but doesn't answer it" }, { "label": "answers it" } ]}Gambar
Kirim gambar di input, sebagai bagian dari pesan pengguna di samping teks apa pun. Berikan data URL base64, atau tautan https publik yang akan diunduh dan diteruskan oleh Zurelay: PNG, JPEG, WebP, atau GIF. Kirim gambar berukuran besar sebagai tautan.
import base64, osfrom openai import OpenAIclient = OpenAI(base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"])with open("return-photo.jpg", "rb") as file: photo = "data:image/jpeg;base64," + base64.b64encode(file.read()).decode()decision = client.decisions.create( model="gpt-6-luna-decisions", input=[ { "role": "user", "content": [ {"type": "input_text", "text": "Photo sent with a return request for a blender."}, {"type": "input_image", "image_url": photo, "detail": "low"}, ], } ], questions=[ { "type": "predicate", "name": "damaged", "instructions": "Does the photo show visible damage to the product?", }, { "type": "choice", "name": "product", "instructions": "What product is in the photo?", "choices": [ {"value": "blender"}, {"value": "kettle"}, {"value": "other", "description": "Anything else, or no product"}, ], }, ],)print(decision.answers)Sebuah gambar menambah token sesuai ukuran dan detail-nya: gambar 1200 × 630 sekitar 750 token pada high atau auto, dan sekitar 150 pada low. Gunakan low jika pertanyaan menyangkut gambar secara keseluruhan, bukan tulisan kecil di dalamnya. Gambar hanya dapat dimasukkan pada input: instruksi dari sebuah pertanyaan hanya menerima teks.
Input JSON
Data terstruktur dapat dikirim apa adanya dalam bagian input_json, bersama teks atau gambar. Model membacanya sebagai teks JSON ringkas, dan penagihannya dihitung berdasarkan teks tersebut.
"input": [ { "role": "user", "content": [ { "type": "input_text", "text": "A sign-up from our app:" }, { "type": "input_json", "data": { "name": "Free Gift Card Giveaway", "email": "win-now@example.net", "bio": "Click my link" } } ] }]Penolakan
Pertanyaan apa pun bisa saja dikembalikan sebagai penolakan, bukan jawaban, sementara pertanyaan lain dalam permintaan yang sama tetap dijawab. Periksa type pada setiap jawaban sebelum Anda membaca field-nya. Dalam pengujian kami, input “Refund requested 38 hours ago.” dengan predikat “Page on-call?” dikembalikan sebagai ditolak.
{ "type": "refusal", "name": "page_on_call" }Penolakan datang dalam balasan biasa, yang usage-nya menunjukkan dasar penagihan permintaan tersebut. Ajukan kembali dengan pertanyaan yang lebih jelas, atau teruskan kasusnya ke petugas.
Batas
- Hingga 1.05M token per permintaan: input dan semua pertanyaan digabungkan. Input sebesar 918K token berhasil dalam pengujian kami.
- 1 hingga 64 pertanyaan.
choicemenerima 2 hingga 255 nilai unik, danscoremenerima 2 hingga 10 tingkat. - Hanya pesan pengguna (user) yang diterima: pesan system, developer, dan assistant, serta item pemanggilan fungsi atau tool, akan ditolak. Letakkan konteks di pesan pengguna, atau di instruksi pertanyaan.
- Tanpa streaming:
streamditolak, dan jawaban dikirim utuh. - Permintaan yang tidak valid, atau yang berisi field yang tidak didukung API, akan ditolak dengan
400yang menyebutkan field-nya (misalnyaquestions[2].choices) sebelum sampai ke model, dan tidak dikenai biaya. - Key yang dibatasi untuk beberapa model harus mencantumkan
gpt-6-luna-decisionsdi daftarnya, termasuk untuk permintaan yang menulisgpt-6-luna. Lihat Batas dan aturan key.
Kecepatan
Dalam pengujian kami, jawaban biasanya kembali dalam 0,3 hingga 1 detik, dan sekitar satu detik jika ada gambar. Input 900K token membutuhkan sekitar 10 detik.
Biaya pengambilan keputusan
GPT-6 Luna Decisions berharga $0.04 per 1M token input, dan jawabannya gratis. Token yang dihitung adalah input Anda, dihitung sekali, ditambah sekitar 110 hingga 160 token milik model sendiri untuk setiap pertanyaan: satu predikat pendek pada teks pendek totalnya sekitar 160 token, dua predikat sekitar 320, dan input 2.600 token dengan empat pertanyaan sekitar 3.200. Gambar menambah token seperti dijelaskan di atas. Jadi satu pemeriksaan dengan satu pertanyaan pada teks pendek berbiaya sekitar $0.0000064, dan sejuta pemeriksaan sekitar $6.40.
Header usage dan x-zurelay-input-tokens pada setiap balasan menunjukkan dasar penagihannya, setiap permintaan tercatat di log permintaan Anda, dan permintaan yang gagal tidak dikenai biaya.
Kesalahan
Key, kredit, anggaran, dan batas laju menghasilkan error yang sama seperti endpoint lainnya: lihat Error. SDK OpenAI akan mencoba ulang error yang memang layak dicoba ulang.
Coba dulu
Ada pertanyaan, atau ada yang kurang? Tanyakan kepada tim dukungan kami dan kami akan menjawab lewat email, biasanya dalam satu menit.