Um die OpenAI Decisions API zu nutzen, senden Sie eine POST-Anfrage an https://api.openai.com/v1/decisions mit "model": "gpt-6-luna", einem input (Text, Bilder oder beides) und einem questions-Array, wobei jede Frage ein predicate, ein choice oder ein score ist. Sie erhalten typisierte Antworten mit Wahrscheinlichkeiten anstelle von zu parsendem Text zurück und zahlen 0,10 $ pro 1 Million Eingabe-Tokens, ohne Gebühren für Ausgabe, Cache-Lesen oder Cache-Schreiben. Der Endpunkt befindet sich ab dem 6. Oktober 2026 in der öffentlichen Beta-Phase.
Dieser Leitfaden behandelt das Abrufen eines Schlüssels, den ersten Aufruf in curl, Python und JavaScript, das Lesen jedes Antworttyps, drei Fragen zu einem Support-Ticket, Bildeingaben, Schwellenwerte und ein Test-Setup in Apidog. Wann dieser Endpunkt überhaupt zu wählen ist, erfahren Sie unter Was ist die OpenAI Decisions API.
Decisions API-Anfrage auf einen Blick
| Feld | Beschreibung |
|---|---|
model |
gpt-6-luna (das einzige in der Beta verfügbare Modell) |
input |
Eine Zeichenkette oder ein Array von user-Nachrichten, deren content eine Zeichenkette oder Teile vom Typ input_text und input_image ist |
questions[].type |
predicate, choice oder score |
questions[].instructions |
Erforderlich; die Frage in einfachen Worten |
questions[].name |
Optional; wird in der Antwort zurückgegeben (null, wenn weggelassen) |
questions[].choices |
Nur für choice; 2 bis 255 eindeutige {value, description}-Objekte, value als Zeichenkette oder Boolescher Wert |
questions[].levels |
Nur für score; geordnete {label, description}-Objekte, niedrigstes zuerst, Indizes ab 0 |
safety_identifier |
Optionale, undurchsichtige Endbenutzer-ID, bis zu 128 Zeichen |
Quelle: die Decisions API-Referenz. Für diesen Endpunkt gibt es keine temperature, stream, tools oder text.format.
Schlüssel abrufen und ersten Aufruf tätigen
Erstellen Sie einen Schlüssel im OpenAI-Dashboard (der OpenAI API-Schlüssel-Leitfaden behandelt dies), exportieren Sie ihn als OPENAI_API_KEY und fügen Sie ihn niemals in Code ein. Stellen Sie dann eine Ja/Nein-Frage:
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?"}
]
}'
Die Antwort hat drei Top-Level-Felder: model, answers und usage. Dies ist die Form aus der OpenAI-Referenz, mit output_tokens bei 0, da der Endpunkt keine Ausgabe berechnet:
{
"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
}
}
Derselbe Aufruf in Python (SDK 3.26.0 oder höher):
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)
Und in JavaScript (SDK 7.30.0 oder höher):
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);
Antwort nach Typ lesen
Antworten werden in der Reihenfolge zurückgegeben, in der Sie sie gestellt haben, jede mit einem type. Prüfen Sie den Typ, da jede Frage als refusal zurückkommen kann.
predicategibtprobabilityzurück, eine Schätzung von 0 bis 1, dass die Bedingung wahr ist.choicegibtchoice(den gewinnendenvalue),probabilitiesals Array von{value, probability}-Objekten undconfidencezurück.scoregibtscore,probabilitiesals Array von{value, label, probability}-Objekten (wobeivalueder 0-basierte Level-Index ist) undconfidencezurück. Der Score ist der wahrscheinlichkeitsgewichtete Durchschnitt der Level-Indizes, sodass er zwischen den Leveln liegen kann: 1.1 bedeutet „zwischen Level 1 und Level 2, nahe 1“.refusalgibt nurtypeundnamezurück. Das Modell hat diese Frage abgelehnt; andere Fragen in derselben Anfrage können weiterhin Antworten erhalten.
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)
Der Leitfaden von OpenAI zieht die Grenze wie folgt: choice für Kategorien ohne Reihenfolge, wie Abteilungen; score für geordnete Level, wie Schweregrade.
Drei Fragen zu einem Support-Ticket
Unabhängige Fragen teilen sich eine Anfrage und einen input, und jede Frage kann einen anderen Typ verwenden. Hier sind ein Prädikat, eine Auswahl und ein Score für ein einzelnes Ticket:
{
"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"}
]}
]
}
Das answers-Array wird in der gleichen Reihenfolge zurückgegeben. Die unten stehenden choice-Werte sind die Richtwerte von OpenAI für diese spezifische Eingabe; die Prädikat- und Score-Werte sind illustrativ:
"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}
]
Zwei Regeln aus dem Leitfaden: Fügen Sie einen Fallback wie other ein, wenn Ihre Kategorien nicht alle Eingaben abdecken, und formulieren Sie Fragen anhand beobachtbarer Kriterien, sodass benachbarte Score-Level unterschiedliche Bedeutungen haben. Wenn eine zweite Entscheidung von der ersten Antwort abhängt, senden Sie eine separate Anfrage.
Bildeingabe
Übergeben Sie ein Bild als Inhaltsteil innerhalb einer user-Nachricht. Der Leitfaden dokumentiert Inline-Base64-Daten-URLs:
{
"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?"}
]
}
Die API-Referenz listet auch öffentlich zugängliche HTTP(S)-URLs auf, bis zu 128 Bilder über alle Nachrichten in einer Anfrage hinweg, sowie ein optionales detail-Feld (low, high, auto, original). Testen Sie daher gehostete URLs mit Ihrem eigenen Konto, bevor Sie sich darauf verlassen. file_id-Eingaben werden auf keiner Seite unterstützt.
Schwellenwerte aus beschrifteten Beispielen auswählen
OpenAI veröffentlicht keine Genauigkeits- oder Kalibrierungsdaten für den Endpunkt. Die Empfehlung ist, beschriftete Beispiele aus Ihrer eigenen Anwendung zu verwenden, um Schwellenwerte für Routing, Filterung oder Überprüfung festzulegen, basierend auf den Kosten von False Positives im Vergleich zu False Negatives. In der Praxis bedeutet dies eine kleine CSV-Datei mit echten Tickets und der von einem Menschen ausgewählten Abteilung, die durch dieselbe Anfrage verarbeitet wird, damit Sie sehen können, wo confidence eindeutige Routen von jenen trennt, die eine Person benötigen. Der nächste Abschnitt baut diese Schleife auf.
Die Decisions API in Apidog testen
Gespeicherte Anfragen machen die Schwellenwertoptimierung und Regressionstests wiederholbar. Hier ist das Setup in Apidog:
- Speichern Sie den Schlüssel als Umgebungsvariable. Erstellen Sie eine Umgebung, fügen Sie
OPENAI_API_KEYals geheime Variable hinzu (Apidog-Umgebungen und geheime Variablen zeigt das Setup) und setzen Sie denAuthorization-Header aufBearer {{OPENAI_API_KEY}}. Der Schlüssel gelangt niemals in einen gemeinsam genutzten Anfragekörper. - Speichern Sie eine Anfrage pro Fragetyp. Erstellen Sie eine POST-Anfrage an
https://api.openai.com/v1/decisionsmitContent-Type: application/json, fügen Sie diechoice-Frage aus dem obigen Ticketbeispiel separat ein und speichern Sie sie. Duplizieren Sie sie für die Prädikat- und Score-Versionen. - Fügen Sie JSONPath-Assertions hinzu. Bei der Auswahl-Anfrage: Status ist 200,
$.answers[0].typeist gleichchoice,$.answers[0].choiceist gleichbilling,$.answers[0].confidenceist größer als 0.8 und$.usage.output_tokensist gleich 0. Für das Schadensprädikat: Behaupten Sie, dass$.answers[?(@.name=='damaged')].probabilitygrößer als 0.9 ist. Eine Änderung der Formulierung in Ihren Anweisungen oder eine Verhaltensänderung des Modells lässt nun einen Test fehlschlagen, anstatt Tickets falsch zu routen. - Führen Sie dies über beschriftete Tickets aus. Erstellen Sie ein Testszenario aus der gespeicherten Anfrage und fügen Sie eine kleine CSV-Datei mit zwei Spalten an:
ticket_textundexpected_department. Bilden Sie{{ticket_text}}aufinputab und behaupten Sie, dass$.answers[0].choicegleich{{expected_department}}ist. Der Ausführungsbericht zeigtconfidencefür jede Zeile an, was die Daten sind, aus denen OpenAI empfiehlt, Schwellenwerte festzulegen. Der Punkt, unter dem jede Fehlleitung liegt, wird in Ihrem Code zu Ihrem „automatisch weiterleiten“-Schwellenwert. - Mocken Sie das
answers-Array für das Frontend. Verweisen Sie den Router oder die Benutzeroberfläche auf einen Mock desselben Endpunkts, der einechoice-Antwort mitconfidenceüber und unter Ihrem Schwellenwert sowie einerefusalzurückgibt, damit der Überprüfungs-Warteschlangenpfad erstellt wird, bevor Sie ein Eingabe-Token ausgeben. Bedingte Mock-Antworten in Apidog behandelt das Umschalten von Mocks basierend auf dem Anfraginhalt. - Führen Sie das Szenario in CI aus. Exportieren Sie ein Zugriffstoken und fügen Sie dann einen Schritt zu Ihrer Pipeline hinzu:
apidog run --access-token "$APIDOG_ACCESS_TOKEN" \
-t "$SCENARIO_ID" -e "$ENV_ID" -r cli,junit
Eine fehlgeschlagene Assertion führt zum Fehlschlagen des Builds, sodass ein leiser Rückgang der confidence vor dem Deployment und nicht erst in der Support-Warteschlange bemerkt wird. Für breitere Muster siehe Testen von LLM-Anwendungen.
Fehler und Grenzfälle behandeln
- 429 ratenbegrenzt. Es wurden keine Decisions-spezifischen Limits veröffentlicht; überprüfen Sie Ihre Zahlen unter Einstellungen > Organisation > Limits. Führen Sie einen exponentiellen Backoff durch und beachten Sie den
Retry-After-Header, falls vorhanden. Der Leitfaden für überschrittene Ratenbegrenzung enthält einen Retry-Wrapper. - Ablehnungsantworten. Behandeln Sie
type: "refusal"als Routing-Ergebnis, nicht als Ausnahme. Senden Sie dieses Ticket an einen Menschen und behalten Sie die anderen Antworten aus derselben Anfrage bei. - Abhängige Entscheidungen. Jede Frage wird unabhängig vom gemeinsamen Input bewertet. Alles, was von einer früheren Antwort abhängt, benötigt eine eigene Anfrage.
FAQ
- Wie viel kostet die Decisions API? 0,10 $ pro 1 Million Eingabe-Tokens auf
gpt-6-luna, ohne Gebühren für Ausgabe, Cache-Lesen oder Cache-Schreiben. Ein 500-Token-Ticket mit drei Fragen kostet 500 / 1.000.000 x 0,10 $ = 0,00005 $, sodass eine Million solcher Tickets 50 $ kosten. Long-Context-Eingaben über 272.000 Tokens kosten das Doppelte, und regionale Verarbeitung fügt 10 % hinzu. - Ist die Decisions API kostenlos? Nein. Es gibt keine kostenlose Decisions-Stufe. Wenn Sie GPT-6 Luna kostenlos ausprobieren möchten, listet der Beitrag Kostenlose Routen für GPT-6 Luna auf, welche Möglichkeiten es gibt.
- Wie schnell ist es? OpenAI gibt an, dass es etwa 10-mal schneller ist als die Responses API und veröffentlicht keine absolute Latenzzahl. Ein Entwickler im OpenAI-Forum berichtete von Bildentscheidungen in etwa 0,8 Sekunden.
- Welche Modelle funktionieren mit der Decisions API? Heute nur
gpt-6-luna. Es ist ein Endpunkt auf Luna, kein separates Modell. Siehe Was ist GPT-6 Luna für das Modell selbst. - Wann sollte ich stattdessen Structured Outputs verwenden? Wenn Sie ein Objekt in Ihrem eigenen JSON-Schema benötigen, z. B. extrahierte Felder oder eine schriftliche Erklärung, oder Funktionsaufrufe, wenn das Modell ein Tool mit Argumenten anfordern soll. Der Beitrag Decisions API vs. Responses API zeigt dasselbe Ticket auf beide Arten.
- Wie schneidet es im Vergleich zu Jev ab? Beide geben typisierte Antworten mit Wahrscheinlichkeiten zurück und berechnen nur die Eingabe; Jev ist textbasiert und kostet 0,042 $ pro 1 Million. Der Vergleich Decisions API vs. Jev enthält die vollständige Tabelle.
Nächster Schritt
Senden Sie die Drei-Fragen-Ticketanfrage aus diesem Leitfaden, führen Sie sie dann über 20 Ihrer eigenen beschrifteten Tickets aus und sehen Sie, wo confidence korrekte Routen von falschen trennt. Dann laden Sie Apidog herunter, um die Anfrage, das CSV-Szenario und die Assertions zusammenzuhalten, damit der heute von Ihnen gewählte Schwellenwert bei jeder Bereitstellung erneut überprüft wird.
