Beslissingen

OpenAI Decisions API

Stel GPT-6 Luna Decisions classificatie- en scorevragen over tekst, afbeeldingen van JSON, en krijg getypeerde antwoorden waar je code mee aan de slag kan: hoe waarschijnlijk een bewering waar is, welke van je waarden past, of waar iets op je schaal valt, telkens met de bijbehorende kansen. Veel vragen in één verzoek, meestal in minder dan een seconde, via OpenAI's eigen Decisions API en SDK's.

POST/v1/decisions
ModelIDInvoer, per 1M tokensPrijs van OpenAIOutput
GPT-6 Luna Decisionsgpt-6-luna-decisions$0.04$0.10Gratis

GPT-6 Luna Decisions is het decisionmodel van OpenAI. Het leest je input en beantwoordt de vragen die je erover stelt. Het schrijft geen tekst, dus het is geen chatmodel: stuur het naar /v1/decisions, niet naar /v1/chat/completions. Op dit endpoint werkt gpt-6-luna ook als model-ID, zoals in de SDK-documentatie van OpenAI zelf, dus voorbeeldcode van OpenAI draait ongewijzigd. De model in het antwoord zegt gpt-6-luna-decisions. Voor Jev, het decisionmodel van TypeSafe, zie Beslissingen (Jev).

Vragen stellen

# 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")

Richt de SDK van OpenAI op https://api.zurelay.com/v1, met /v1 zoals bij elk OpenAI-model op Zurelay, gebruik je Zurelay-sleutel en roep client.decisions.create aan. In Node.js heb je daarvoor openai 7.30.0 of nieuwer nodig; in Python een openai-pakket dat recent genoeg is om client.decisions te hebben (3.41 heeft het). Elke HTTP-client werkt op dezelfde manier: POST de JSON met je sleutel als Bearer-token.

Het antwoord

Antwoord
{
"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 bevat één antwoord per vraag, in de volgorde waarin je ze stelde, elk met zijn type en, als je die opgaf, zijn name. usage is waarop het verzoek is afgerekend: input_tokens, waarbij output_tokens altijd 0 is, en cost wat het kostte in Amerikaanse dollars. De x-request-id-header van het antwoord helpt je het verzoek terug te vinden in je requestlog, en x-zurelay-input-tokens herhaalt waarop er is afgerekend.

Parameters

modelstringverplicht
gpt-6-luna-decisions, of gpt-6-luna op dit endpoint.
inputstring of arrayverplicht
Waarover je wilt laten beslissen: een niet-lege tekst of een array met gebruikersberichten, { "role": "user", "content": ... } ("type": "message" is optioneel). De content van een bericht is een tekst of een array met onderdelen, zie hieronder.
questionsarrayverplicht
1 tot 64 vragen, beantwoord in de volgorde waarin je ze opgeeft.
safety_identifierstring
Optioneel: een ondoorzichtige id voor de eindgebruiker voor wie het verzoek is, zoals een hash van je eigen gebruikers-id.
prompt_cache_keystring
Wordt geaccepteerd en genegeerd, net als prompt_cache_options: caching gaat automatisch en elk invoertoken kost evenveel.
Per vraag
typestringverplicht
predicate, choice of score.
instructionsstringverplicht
De vraag, als tekst. Afbeeldingen horen in de invoer, niet hier.
namestring
Optioneel en uniek binnen het verzoek: komt terug bij het antwoord op de vraag, zodat je antwoorden op naam kunt uitlezen.
choicesarray
Voor een choice (verplicht): 2 tot 255 waarden, elk { "value": ..., "description": ... }. Een waarde is tekst of true/false, en elke waarde moet uniek zijn; de beschrijving is optioneel.
levelsarray
Voor een score (verplicht): 2 tot 10 niveaus, laagste eerst, elk { "label": ..., "description": ... }, met een optionele beschrijving.
Onderdelen van de content van een bericht
input_text{ text }
Tekst.
input_image{ image_url, detail }
Een PNG-, JPEG-, WebP- of GIF-afbeelding: een base64 data-URL of een openbare https-link die Zurelay downloadt. detail is optioneel: low, high, auto of original.
input_json{ data }
Een object of een array, zoals een record of de status van je app. Het model leest het als compacte JSON-tekst en het wordt ook als die tekst geteld.

Vraagtypen

TypeVraagt naarAnswer
predicateHoe waarschijnlijk het is dat een bewering over de invoer waar isprobability, van 0 tot 1
choiceWelke van je 2 tot 255 waarden pastchoice, een confidence en de probabilities van elke waarde
scoreWaar de invoer valt op je 2 tot 10 geordende niveausscore, een confidence en de probabilities van elk niveau

Eén verzoek kan alle drie combineren. De invoer wordt voor alle vragen samen één keer gelezen, dus meerdere vragen in één verzoek kosten minder dan elke vraag in een eigen verzoek.

Predicaat

Een bewering of ja/nee-vraag over de invoer. De probability van het antwoord geeft aan hoe waarschijnlijk het is dat die waar is: dicht bij 1 voor ja, dicht bij 0 voor nee, en ertussenin als de invoer het niet duidelijk zegt.

Vraag, dan antwoord
{ "type": "predicate", "name": "refund", "instructions": "Is the customer asking for a refund?" }
{ "type": "predicate", "name": "refund", "probability": 1 }

Keuze

Kiest een van de waarden die je opgeeft en geeft de kans van elke waarde. Een beschrijving legt uit wat een waarde betekent, handig als de waarde zelf een code is. Waarden kunnen ook true en false zijn, en de tekst "true" en de boolean true zijn verschillende waarden.

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" }
]
}

Score

Plaatst de invoer op je niveaus, laagste eerst. score is het verwachte niveau: de index van elk niveau, geteld vanaf 0, gewogen naar zijn kans. Het kan dus tussen twee niveaus uitkomen: in het voorbeeldantwoord hierboven is 0.18 vooral het eerste niveau met een beetje van het tweede. Elk item in probabilities heeft de index van het niveau als value en de bijbehorende label.

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" }
]
}

Afbeeldingen

Stuur afbeeldingen mee in de invoer, als onderdelen van een gebruikersbericht naast eventuele tekst. Geef een base64 data-URL of een openbare https-link op, die Zurelay downloadt en doorstuurt: PNG, JPEG, WebP of GIF. Stuur grote afbeeldingen als link.

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)

Een afbeelding voegt tokens toe op basis van de grootte en detail: een afbeelding van 1200 × 630 is ongeveer 750 tokens bij high of auto, en ongeveer 150 bij low. Gebruik low als de vraag over de hele afbeelding gaat en niet over kleine lettertjes. Afbeeldingen kunnen alleen in de invoer: de instructies van een vraag accepteren alleen tekst.

JSON-invoer

Gestructureerde data kun je zoals ze zijn meesturen, in een input_json-onderdeel naast tekst of afbeeldingen. Het model leest het als compacte JSON-tekst en het wordt ook als die tekst in rekening gebracht.

Invoer met JSON
"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" }
}
]
}
]

Weigeringen

Elke vraag kan als weigering terugkomen in plaats van als antwoord, terwijl de andere vragen in het verzoek wel gewoon worden beantwoord. Controleer de type van elk antwoord voordat je de velden uitleest. In onze tests werd de invoer “Refund requested 38 hours ago.” met het predicaat “Page on-call?” geweigerd.

Een geweigerde vraag
{ "type": "refusal", "name": "page_on_call" }

Een weigering komt binnen in een gewoon antwoord, waarvan usage aangeeft op welke basis het verzoek is gefactureerd. Stel de vraag opnieuw met een duidelijkere formulering, of leg het geval voor aan een persoon.

Limieten

  • Maximaal 1.05M tokens per verzoek: de invoer en alle vragen samen. Een invoer van 918K tokens werkte in onze tests.
  • 1 tot 64 vragen. Een choice accepteert 2 tot 255 unieke waarden en een score 2 tot 10 niveaus.
  • Alleen gebruikersberichten: system-, developer- en assistant-berichten en function- of tool-call-items worden geweigerd. Zet context in een gebruikersbericht of in de instructies van een vraag.
  • Geen streaming: stream wordt geweigerd en de antwoorden komen altijd in één keer terug.
  • Een onjuist opgebouwd verzoek, of een verzoek met een veld dat de API niet accepteert, wordt geweigerd met een 400 die het veld noemt (zoals questions[2].choices) voordat het het model bereikt, en kost niets.
  • Een key die beperkt is tot bepaalde modellen heeft gpt-6-luna-decisions nodig op de lijst, ook voor verzoeken met gpt-6-luna. Zie Key-limieten en regels.

Snelheid

In onze tests komen antwoorden meestal binnen 0,3 tot 1 seconde terug, en met een afbeelding in ongeveer een seconde. Een invoer van 900K tokens duurde ongeveer 10 seconden.

Betalen voor beslissingen

GPT-6 Luna Decisions kost $0.04 per 1M invoertokens, en de antwoorden zijn gratis. De tokens zijn je invoer, één keer geteld, plus ongeveer 110 tot 160 eigen tokens van het model per vraag: één kort predicaat over een korte tekst is samen ongeveer 160 tokens, twee ongeveer 320, en een invoer van 2.600 tokens met vier vragen ongeveer 3.200. Afbeeldingen komen er met hun tokens bij, zoals hierboven. Een check met één vraag over een korte tekst kost dus ongeveer $0.0000064, en een miljoen van die checks ongeveer $6.40.

De headers usage en x-zurelay-input-tokens bij elk antwoord laten zien waarop er is gefactureerd, elk verzoek staat in je verzoeklog, en mislukte verzoeken kosten niets.

Fouten

StatusCodeWanneer
400invalid_requestHet verzoek is onjuist opgebouwd of gebruikt iets wat de API niet accepteert. De melding zegt wat en waar.
400invalid_inputEen afbeeldingslink kon niet worden gedownload of is geen PNG-, JPEG-, WebP- of GIF-afbeelding.
400context_length_exceededDe invoer en vragen komen samen boven de 1.05M tokens uit. Stuur een kortere invoer.
503model_unavailable of service_unavailableHet model is tijdelijk niet beschikbaar. Probeer het opnieuw na het aantal seconden in de retry-after-header.

Keys, tegoed, budgetten en rate limits geven dezelfde fouten als elk ander endpoint: zie Fouten. De SDKs van OpenAI proberen de fouten opnieuw waarbij dat zinvol is.

Probeer het eerst uit

Kies in de Playground van het dashboard GPT-6 Luna Decisions, plak de inhoud of voeg een afbeelding toe en stel ernaast je vragen in. Met de knop Get code krijg je hetzelfde verzoek met de SDK van OpenAI voor Python of Node.js, of als cURL.

Vragen, of ontbreekt er iets? Vraag het ons supportteam en je krijgt antwoord per e-mail, meestal binnen een minuut.