Kararlar
OpenAI Decisions API
GPT-6 Luna Decisions modeline metin, görsel veya JSON hakkında sınıflandırma ve puanlama soruları sorun, kodunuzun doğrudan kullanabileceği tipli yanıtlar alın: bir ifadenin ne kadar doğru olduğu, değerlerinizden hangisine uyduğu ya da ölçeğinizde nereye düştüğü, hepsi olasılıklarıyla birlikte. Tek istekte birçok soru, çoğunlukla bir saniyenin altında, OpenAI’nin kendi Decisions API’si ve SDK’ları üzerinden.
/v1/decisionsGPT-6 Luna Decisions, OpenAI’nin karar modelidir. Girdinizi okur ve onunla ilgili belirlediğiniz soruları yanıtlar; metin yazmaz, dolayısıyla bir sohbet modeli değildir: isteği /v1/decisions adresine gönderin, /v1/chat/completions adresine değil. Bu uç noktada gpt-6-luna değeri model ID’si olarak da çalışır, tıpkı OpenAI’nin kendi SDK belgelerindeki gibi; böylece OpenAI’nin örnek kodu olduğu gibi çalışır. Yanıttaki model alanında gpt-6-luna-decisions yazar. TypeSafe’in karar modeli Jev için bkz. Kararlar (Jev).
Soru sorun
# 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")OpenAI’nin SDK’sını https://api.zurelay.com/v1 adresine yönlendirin; /v1 ayarı Zurelay’deki her OpenAI modelinde olduğu gibi kullanılır. Zurelay anahtarınızı kullanın ve client.decisions.create çağrısını yapın. Node.js’te bunun için openai 7.30.0 veya üstü gerekir; Python’da ise client.decisions özelliğini içerecek kadar yeni bir openai paketi gerekir (3.41’de var). Herhangi bir HTTP istemcisi de aynı şekilde çalışır: JSON’u, anahtarınızı Bearer token olarak vererek POST edin.
Yanıt
{ "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, sorduğunuz sırayla her soru için bir yanıt içerir; her yanıtta type ve, verdiyseniz, name bulunur. usage isteğin neye göre ücretlendirildiğini gösterir: input_tokens, output_tokens her zaman 0, cost ise ABD doları cinsinden maliyet. Yanıttaki x-request-id başlığı isteğinizi istek günlüğünde bulmanızı sağlar, x-zurelay-input-tokens ise neye göre ücretlendirildiğini yineler.
Parametreler
modelstringzorunlugpt-6-luna-decisionsveya bu uç noktadagpt-6-luna.inputstring veya arrayzorunlu- Karar verilecek içerik: boş olmayan bir metin ya da kullanıcı mesajlarından oluşan bir dizi,
{ "role": "user", "content": ... }("type": "message"isteğe bağlıdır). Bir mesajıncontentdeğeri, aşağıda açıklandığı gibi bir metin ya da parça dizisidir. questionsarrayzorunlu- Listelediğiniz sırayla yanıtlanan 1 ila 64 soru.
safety_identifierstring- İsteğe bağlı: isteğin yapıldığı son kullanıcıya ait, anlam taşımayan bir kimlik; örneğin kendi kullanıcı kimliğinizin hash'i.
prompt_cache_keystring- Kabul edilir ve yok sayılır;
prompt_cache_optionsiçin de aynısı geçerlidir: önbellekleme otomatiktir ve her girdi token'ı aynı fiyattan ücretlendirilir.
typestringzorunlupredicate,choiceveyascore.instructionsstringzorunlu- Soru, metin olarak. Görseller buraya değil, girdiye (input) eklenir.
namestring- İsteğe bağlıdır ve istek içinde benzersiz olmalıdır: sorunun yanıtında geri döner, böylece yanıtları ada göre okuyabilirsiniz.
choicesarraychoiceiçin (zorunlu): 2 ila 255 değer, her biri{ "value": ..., "description": ... }. Bir değer metin veyatrue/falseolabilir ve her değer benzersiz olmalıdır; açıklama isteğe bağlıdır.levelsarray- Bir
scoreiçin (zorunlu): 2 ila 10 düzey, en düşükten başlayarak; her biri{ "label": ..., "description": ... }, açıklama isteğe bağlı.
input_text{ text }- Metin.
input_image{ image_url, detail }- PNG, JPEG, WebP veya GIF biçiminde bir görsel: base64 veri URL'si ya da Zurelay'in indirdiği herkese açık bir
httpsbağlantısı.detailisteğe bağlıdır:low,high,autoveyaoriginal. input_json{ data }- Bir nesne veya dizi; örneğin bir kayıt ya da uygulamanızın durumu. Model bunu sıkıştırılmış JSON metni olarak okur ve bu metin olarak sayılır.
Soru türleri
Tek bir istekte üçünü birlikte kullanabilirsiniz. Girdi üçü için de yalnızca bir kez okunur; bu yüzden aynı istekte birkaç soru sormak, her birini ayrı bir istekte sormaktan daha ucuza gelir.
Koşul
Girdi hakkında bir ifade veya evet/hayır sorusu. Yanıtın probability değeri, bunun doğru olma olasılığını gösterir: evet için 1'e, hayır için 0'a yakın olur; girdi net bir şey söylemiyorsa bu ikisinin arasında kalır.
{ "type": "predicate", "name": "refund", "instructions": "Is the customer asking for a refund?" }{ "type": "predicate", "name": "refund", "probability": 1 }Seçim
Listelediğiniz değerlerden birini seçer ve her birinin olasılığını verir. Açıklama, bir değerin ne anlama geldiğini belirtir; değerin tek başına bir kod olduğu durumlarda işe yarar. Değerler true ve false da olabilir; "true" metni ile true boolean değeri farklı değerlerdir.
{ "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" } ]}Puan
Girdiyi, en düşükten başlayarak seviyelerinize yerleştirir. score, beklenen seviyedir: her seviyenin 0'dan başlayarak sayılan dizini, olasılığıyla ağırlıklandırılır. Bu nedenle iki seviye arasında bir değer çıkabilir: yukarıdaki örnek yanıtta 0.18, ağırlıklı olarak birinci seviyedir ve ikinci seviyeden de küçük bir pay içerir. probabilities içindeki her girdi, seviyenin dizinini value olarak ve label değerini taşır.
{ "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" } ]}Görseller
Görselleri girdide, bir kullanıcı mesajının parçaları olarak metnin yanında gönderebilirsiniz. Base64 data URL'si ya da herkese açık bir https bağlantısı verin; Zurelay bağlantıyı indirip iletir. Desteklenen biçimler: PNG, JPEG, WebP veya GIF. Büyük görselleri bağlantı olarak gönderin.
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)Bir görsel, boyutuna ve detail ayarına göre token ekler: 1200 × 630 boyutunda bir görsel high veya auto ile yaklaşık 750 token, low ile ise yaklaşık 150 token tutar. Soru ince yazılarla değil, görselin bütünüyle ilgiliyse low kullanın. Görseller yalnızca girdiye eklenir: bir sorunun talimatları ise yalnızca metin kabul eder.
JSON girdisi
Yapılandırılmış veriyi olduğu gibi, metin veya görsellerin yanında bir input_json bölümü içinde gönderebilirsiniz. Model bunu kompakt JSON metni olarak okur ve bu metin olarak faturalandırılır.
"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" } } ] }]Reddedilen istekler
Herhangi bir soru yanıt yerine ret olarak dönebilir; isteğteki diğer sorular ise yine de yanıtlanır. Alanlarını okumadan önce her yanıtın type değerini kontrol edin. Testlerimizde, "Refund requested 38 hours ago." girdisi ve "Page on-call?" yüklemi ret olarak döndü.
{ "type": "refusal", "name": "page_on_call" }Ret, normal bir yanıt olarak gelir; bu yanıttaki usage isteğin neye göre faturalandırıldığını gösterir. Daha net bir soruyla tekrar deneyin ya da durumu bir kişiye iletin.
Sınırlar
- İstek başına en fazla 1.05M token: girdi ve tüm sorular birlikte. Testlerimizde 918K token'lık bir girdi sorunsuz çalıştı.
- 1 ile 64 arasında soru. Bir
choice2 ile 255 arasında benzersiz değer, birscoreise 2 ile 10 arasında düzey alır. - Yalnızca kullanıcı mesajları kabul edilir: sistem, geliştirici ve asistan mesajları ile fonksiyon veya araç çağrısı öğeleri reddedilir. Bağlamı bir kullanıcı mesajına ya da sorunun talimatlarına ekleyin.
- Akış (streaming) yok:
streamreddedilir ve yanıtlar bütün olarak döner. - Hatalı biçimlendirilmiş bir istek ya da API'nin kabul etmediği bir alan içeren istek, model çalışmadan önce alanı belirten bir
400ile (örneğinquestions[2].choices) reddedilir ve ücret çıkmaz. - Yalnızca bazı modellerle sınırlandırılmış bir anahtarın listesinde
gpt-6-luna-decisionsbulunmalıdır; istekgpt-6-lunadese bile bu geçerlidir. Bkz. Anahtar sınırları ve kuralları.
Hız
Testlerimizde yanıtlar genellikle 0,3 ila 1 saniyede, görselli isteklerde ise yaklaşık bir saniyede geliyor. 900K token'lık bir girdi yaklaşık 10 saniye sürdü.
Kararların ücretlendirilmesi
GPT-6 Luna Decisions, 1M girdi token'ı başına $0.04 tutarında ücretlendirilir; yanıtları ücretsizdir. Token'lar, bir kez sayılan girdinizden ve her soru için modelin kendi ürettiği yaklaşık 110 ila 160 token'dan oluşur: kısa bir metinde tek bir kısa önerme toplam yaklaşık 160 token, iki önerme yaklaşık 320 token, 2.600 token'lık bir girdi ve dört soru ise yaklaşık 3.200 token eder. Görseller, yukarıda belirtildiği gibi kendi token'larını ekler. Yani kısa bir metin üzerinde tek soruluk bir kontrol yaklaşık $0.0000064, bir milyon kontrol ise yaklaşık $6.40 tutar.
Her yanıtın usage ve x-zurelay-input-tokens başlıkları neye göre ücretlendirildiğini gösterir, her istek istek günlüğünüzde yer alır ve başarısız istekler için ücret alınmaz.
Hatalar
Anahtarlar, kredi, bütçeler ve hız sınırları diğer tüm uç noktalarla aynı hataları verir: bkz. Hatalar. OpenAI'ın SDK'ları, yeniden denemeye değer olanları otomatik olarak tekrar dener.
Önce deneyin
Sorunuz mu var, yoksa bir şey mi eksik? Destek ekibimize sorun, genellikle bir dakika içinde e-postayla yanıtlayalım.