Decisions API
Mit der Decisions API trifft ein Modell typisierte Entscheidungen über einen Inhalt, statt Text zu generieren. Sie übergeben den zu bewertenden Inhalt und eine Reihe von Fragen, und das Modell liefert für jede Frage eine strukturierte Antwort: die Wahrscheinlichkeit für Ja/Nein, eine Auswahl aus einer Liste von Optionen oder eine Bewertung auf einer abgestuften Skala, jeweils mit den Wahrscheinlichkeiten pro Option und einem Konfidenzwert.
Die API eignet sich für Klassifizierung, Routing, Moderation, Bewertung, Filterung und alle anderen Fälle, in denen Ihr Code direkt anhand des Ergebnisses verzweigen soll. Das Modell antwortet ausschließlich mit den von Ihnen festgelegten Optionen und Stufen, nie mit Werten außerhalb davon; freier Text muss nicht geparst werden.
Bei der erstmaligen Verwendung von Entscheidungsmodellen wird empfohlen, zunächst den Jev-Leitfaden zu lesen. Er enthält Schnellstart, Fragendesign, eine Erläuterung der Rückgabewerte sowie Anwendungsbeispiele. Diese Seite ist die Referenz auf Feldebene.
Endpunkte
Hinter allen drei Endpunkten stehen dieselben Modelle mit derselben Abrechnung; sie unterscheiden sich nur im Format von Anfrage und Antwort. Wählen Sie den Endpunkt, der zu Ihrem Client passt:
Die Authentifizierung entspricht der der übrigen Endpunkte: Authorization: Bearer <Ihr OFOXAI_API_KEY>. Es werden nur Anfragen ohne Streaming unterstützt; jede Anfrage liefert alle Antworten synchron.
Verfügbare Modelle
Die vollständige Liste der Modelle, die diese API unterstützen, finden Sie auf der Modellseite . Ein Aufruf mit einem gewöhnlichen Chatmodell (etwa openai/gpt-4o) liefert endpoint_not_supported.
Einheitliches Format: /v1/decisions
Anfrageparameter
Eingabeformat
input akzeptiert drei Formen:
- Text: eine einzelne Zeichenkette.
"input": "Customer message: I was charged twice, nobody has answered my two emails, and I need a refund today." - Strukturierte Daten: ein JSON-Objekt, das unverändert an das Modell übergeben wird. Fragen können Feldnamen in Backticks referenzieren, z. B.
`message`."input": { "ticket_id": 4812, "message": "I was charged twice.", "plan": "pro" } - Nachrichten-Array:
[{ "role", "content" }], wobeicontenteine Zeichenkette oder eine Liste von Inhaltsblöcken ist. Nur die Blöckeinput_textundinput_imagewerden unterstützt. Bilder funktionieren nur mit Modellen, die Bilder lesen können. Jev liest keine Bilder; die Übergabe eines Bildes liefert 400.
Frageobjekt
Anfragebeispiele
cURL
curl https://api.ofox.ai/v1/decisions \
-H "Authorization: Bearer $OFOX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "typesafe/jev-latest",
"input": "Customer message: I was charged twice, nobody has answered my two emails, and I need a refund today.",
"questions": [
{ "type": "predicate", "name": "is_frustrated", "instructions": "Is the customer frustrated?" },
{
"type": "choice",
"name": "category",
"instructions": "Which category does this ticket belong to?",
"choices": [
{ "value": "billing", "description": "Charges and refunds" },
{ "value": "bug", "description": "Product issue" },
{ "value": "other", "description": "Other" }
]
},
{
"type": "score",
"name": "urgency",
"instructions": "How quickly does a human need to respond?",
"levels": [
{ "label": "low", "description": "Within a week is fine" },
{ "label": "medium", "description": "Should respond soon" },
{ "label": "high", "description": "Must respond today" }
]
}
]
}'Antwortformat
{
"model": "typesafe/jev-latest",
"answers": [
{ "type": "predicate", "name": "is_frustrated", "probability": 0.97 },
{
"type": "choice",
"name": "category",
"choice": "billing",
"confidence": 1,
"probabilities": [
{ "value": "billing", "probability": 1 },
{ "value": "bug", "probability": 0 },
{ "value": "other", "probability": 0 }
]
},
{
"type": "score",
"name": "urgency",
"score": 2,
"confidence": 1,
"legend": { "0": "low: Within a week is fine", "1": "medium: Should respond soon", "2": "high: Must respond today" },
"probabilities": [
{ "value": 0, "label": "low", "probability": 0 },
{ "value": 1, "label": "medium", "probability": 0 },
{ "value": 2, "label": "high", "probability": 1 }
]
}
],
"usage": { "prompt_tokens": 407, "completion_tokens": 72, "total_tokens": 479 }
}answers entspricht eins zu eins questions, in derselben Reihenfolge. Felder je Antworttyp:
Natives TypeSafe-Format: /typesafe/v1/systemone
Anfrage- und Antwortformat entsprechen der offiziellen TypeSafe API , sodass Sie das TypeSafe SDK direkt verwenden oder bestehenden Code migrieren können. Gegenüber dem einheitlichen Format gibt es folgende Unterschiede:
curl https://api.ofox.ai/typesafe/v1/systemone \
-H "Authorization: Bearer $OFOX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "jev-latest",
"state": "Help! My payouts have been failing for 3 days.",
"questions": {
"is_urgent": { "type": "noul", "instructions": "Does this convey urgency?" },
"department": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Payments, invoicing, refunds",
"technical": "Bugs, outages, integrations",
"sales": "Pricing, upgrades"
}
},
"frustration": {
"type": "score",
"instructions": "How frustrated is the customer?",
"criteria": ["Calm", "Frustrated", "Very angry"]
}
}
}'{
"model": "typesafe/jev-latest",
"answers": {
"is_urgent": { "type": "noul", "noul": 0.95 },
"department": {
"type": "choice",
"choice": "billing",
"confidence": 0.85,
"probabilities": { "billing": 0.9, "technical": 0.1, "sales": 0 }
},
"frustration": {
"type": "score",
"score": 1.03,
"confidence": 0.95,
"legend": { "0": "Calm", "1": "Frustrated", "2": "Very angry" },
"probabilities": { "0": 0, "1": 0.97, "2": 0.03 }
}
},
"usage": { "input_tokens": 399, "output_tokens": 73 }
}SDK-Integration
OpenAI SDK
Das offizielle OpenAI SDK stellt client.decisions.create() bereit. Setzen Sie base_url auf https://api.ofox.ai/v1 und verwenden Sie für den Anfragekörper das einheitliche Format. Ein Beispiel finden Sie oben im Python-Tab. Erforderlich ist eine SDK-Version, die die Decisions API enthält (getestet mit openai Python 3.31.0).
TypeSafe SDK
Setzen Sie im offiziellen TypeSafe SDK base_url auf https://api.ofox.ai/typesafe und ersetzen Sie api_key durch Ihren OfoxAI API Key. Der übrige Code bleibt unverändert:
Python
# pip install typesafe-sdk
import os
from typesafe_sdk import TypeSafeClient, Noul, Choice, Score
with TypeSafeClient(base_url="https://api.ofox.ai/typesafe", api_key=os.environ["OFOX_API_KEY"]) as client:
r = client.system_one(
model="jev-latest",
state={"message": "I was charged twice, nobody has answered my two emails, and I need a refund today."},
questions={
"urgent": Noul(instructions="Is the customer asking for this to be handled today?"),
"dept": Choice(
instructions="Which team should handle this?",
criteria={"billing": "Charges, invoices, refunds", "technical": "Bugs, integrations", "sales": "Pricing, upgrades"},
),
"anger": Score(instructions="How upset is the customer?", criteria=["Calm", "Upset but polite", "Very angry"]),
},
)
print(r.nouls["urgent"].noul) # 0.98
print(r.choices["dept"].choice) # billing
print(r.scores["anger"].score) # 1.56Wahrscheinlichkeit und Konfidenz
- Wahrscheinlichkeit beantwortet die Frage „Wie lautet die Antwort?“:
probabilityundprobabilitiessind die kalibrierten Wahrscheinlichkeiten des Modells für jede mögliche Antwort. - Konfidenz beantwortet die Frage „Kann ich dieser Entscheidung vertrauen?“:
confidencewird aus der Wahrscheinlichkeitsverteilung abgeleitet und ist umso höher, je konzentrierter die Verteilung ist. Liegen zwei Optionen jeweils bei 0.5, liefertchoicedennoch eine davon,confidenceist dann jedoch niedrig.
Üblich ist ein Schwellenwert im Code: Bei hoher Konfidenz wird automatisch gehandelt, bei niedriger Konfidenz wird der Fall an einen Menschen oder ein stärkeres Modell zur Prüfung weitergeleitet.
Abrechnung
Abgerechnet wird pro Token; die Preise finden Sie auf der Modellseite . Bei typesafe/jev-latest werden nur Eingabe-Token berechnet; die Ausgabe ist kostenfrei (completion_tokens / output_tokens werden dennoch zurückgegeben).
Alle Fragen einer Anfrage teilen sich dieselbe Eingabe. Mehrere Fragen in einer Anfrage sind daher deutlich günstiger und schneller als getrennte Aufrufe.
Limits
Häufige Fehler
Weitere allgemeine Fehler finden Sie unter Fehlerbehandlung.