Wie benutzt man die OpenAI Decisions API?

Wie man die OpenAI Decisions API verwendet: erster Aufruf in cURL, Python und JavaScript, Prädikat-, Auswahl- und Punkteantworten, Bildeingabe und Apidog-Tests.

Ashley Innocent

Ashley Innocent

10 October 2026

Wie benutzt man die OpenAI Decisions API?

Apidog für Unternehmen

On-Premises Bereitstellung

SSO & RBAC

SOC 2 konform

Apidog Enterprise entdecken

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.

Button

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.

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:

  1. Speichern Sie den Schlüssel als Umgebungsvariable. Erstellen Sie eine Umgebung, fügen Sie OPENAI_API_KEY als geheime Variable hinzu (Apidog-Umgebungen und geheime Variablen zeigt das Setup) und setzen Sie den Authorization-Header auf Bearer {{OPENAI_API_KEY}}. Der Schlüssel gelangt niemals in einen gemeinsam genutzten Anfragekörper.
  2. Speichern Sie eine Anfrage pro Fragetyp. Erstellen Sie eine POST-Anfrage an https://api.openai.com/v1/decisions mit Content-Type: application/json, fügen Sie die choice-Frage aus dem obigen Ticketbeispiel separat ein und speichern Sie sie. Duplizieren Sie sie für die Prädikat- und Score-Versionen.
  3. Fügen Sie JSONPath-Assertions hinzu. Bei der Auswahl-Anfrage: Status ist 200, $.answers[0].type ist gleich choice, $.answers[0].choice ist gleich billing, $.answers[0].confidence ist größer als 0.8 und $.usage.output_tokens ist gleich 0. Für das Schadensprädikat: Behaupten Sie, dass $.answers[?(@.name=='damaged')].probability größ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.
  4. 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_text und expected_department. Bilden Sie {{ticket_text}} auf input ab und behaupten Sie, dass $.answers[0].choice gleich {{expected_department}} ist. Der Ausführungsbericht zeigt confidence fü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.
  5. Mocken Sie das answers-Array für das Frontend. Verweisen Sie den Router oder die Benutzeroberfläche auf einen Mock desselben Endpunkts, der eine choice-Antwort mit confidence über und unter Ihrem Schwellenwert sowie eine refusal zurü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.
  6. 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

FAQ

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.

Praktizieren Sie API Design-First in Apidog

Entdecken Sie eine einfachere Möglichkeit, APIs zu erstellen und zu nutzen