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.

POST/v1/decisions
ModelIDGirdi, 1M token başınaOpenAI’nin fiyatıÇıktı
GPT-6 Luna Decisionsgpt-6-luna-decisions$0.04$0.10Ücretsiz

GPT-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 openai
import os
from openai import OpenAI
client = 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 asked
for 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

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

modelstringzorunlu
gpt-6-luna-decisions veya bu uç noktada gpt-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ın content değ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_options için de aynısı geçerlidir: önbellekleme otomatiktir ve her girdi token'ı aynı fiyattan ücretlendirilir.
Her soru
typestringzorunlu
predicate, choice veya score.
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.
choicesarray
choice için (zorunlu): 2 ila 255 değer, her biri { "value": ..., "description": ... }. Bir değer metin veya true/false olabilir ve her değer benzersiz olmalıdır; açıklama isteğe bağlıdır.
levelsarray
Bir score için (zorunlu): 2 ila 10 düzey, en düşükten başlayarak; her biri { "label": ..., "description": ... }, açıklama isteğe bağlı.
Bir mesajın içeriğinin bölümleri
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 https bağlantısı. detail isteğe bağlıdır: low, high, auto veya original.
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

TürSorulanAnswer
predicateGirdiyle ilgili bir ifadenin doğru olma olasılığıprobability, 0 ile 1 arasında
choice2 ile 255 arasındaki değerlerinizden hangisi uygunchoice, bir confidence ve her değere ait probabilities
score2 ila 10 arasındaki sıralı seviyeleriniz içinde nerede yer aldığıscore, bir confidence ve her seviyedeki probabilities

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.

Önce soru, sonra cevap
{ "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.

Question
{
"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.

Question
{
"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, os
from openai import OpenAI
client = 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.

JSON ile girdi
"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ü.

Reddedilen bir soru
{ "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 choice 2 ile 255 arasında benzersiz değer, bir score ise 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: stream reddedilir 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 400 ile (örneğin questions[2].choices) reddedilir ve ücret çıkmaz.
  • Yalnızca bazı modellerle sınırlandırılmış bir anahtarın listesinde gpt-6-luna-decisions bulunmalıdır; istek gpt-6-luna dese 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

DurumKodNe zaman
400invalid_requestİstek hatalı biçimlendirilmiş ya da API'nin kabul etmediği bir şey içeriyor. Mesaj, neyin ve nerede olduğunu belirtir.
400invalid_inputBir görsel bağlantısı indirilemedi ya da PNG, JPEG, WebP veya GIF görseli değil.
400context_length_exceededGirdi ve sorular birlikte 1.05M token'ı aşıyor. Daha kısa bir girdi gönderin.
503model_unavailable veya service_unavailableModel kısa süreliğine kullanılamıyor. retry-after başlığındaki saniye kadar bekleyip yeniden deneyin.

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

Kontrol panelindeki Deneme alanı'da GPT-6 Luna Decisions'ı seçin, içeriği yapıştırın ya da bir görsel ekleyin ve sorularınızı yanında belirleyin. Get code düğmesi, aynı isteği OpenAI'ın Python veya Node.js SDK'sı ile ya da cURL olarak yazar.

Sorunuz mu var, yoksa bir şey mi eksik? Destek ekibimize sorun, genellikle bir dakika içinde e-postayla yanıtlayalım.