So stellst du eine bestehende Integration von TypeSafes Jev auf die Jev-kompatible API von Decision Models um: Konfiguration prüfen, Anfragen testen und den Wechsel kontrolliert durchführen.
Jev ist ein Produkt von TypeSafe AI; Decision Models ist nicht mit TypeSafe AI verbunden.
Sichere deine bisherige Konfiguration und repräsentative Testfälle. Prüfe Fragetypen, Optionen, Bilder, Antwortauswertung und Wiederholungen. Bewahre den bisherigen Anbieter als bewusste Rückfalloption auf.
Basis-URL und Pfad setzen
Verwende https://api.decisionmodels.io als Basis-URL und POST /v1/systemone für Text. Entferne einen vorhandenen /v1-Suffix, wenn dein Client den Pfad selbst ergänzt. Prüfe den tatsächlich gesendeten Pfad.
Eigenen API-Schlüssel erstellen
Erstelle einen Decision-Models-Schlüssel im Dashboard und sende ihn als Authorization: Bearer. TypeSafe-Schlüssel, Guthaben und Konten werden nicht übertragen. Speichere den Schlüssel in einer Umgebungsvariable.
Modell-ID ersetzen
Ersetze die TypeSafe-Modell-ID durch eine verfügbare Decision-Models-ID, etwa s1-fast. Prüfe GET /v1/models, statt einen TypeSafe-Alias zu übernehmen.
Verarbeitungsregion bewusst wählen
Setze zum Beispiel S1-Region: eu. Zulässig sind eu oder global, soweit dein Schlüssel die Stufe erlaubt; ohne Header gilt dessen Standard. EU-Anfragen bleiben in der EU. Bei Peer-to-Peer erlaubt erst die Zustimmung am Schlüssel eine Verarbeitung weltweit. Verarbeitung und Vertragsbedingungen.
Fragen auf Modellgrenzen aufteilen
Für s1-pro gelten bis zu 3 Textfragen je Anfrage, für s1-fast 1 und s1-vision 1. Weitere Fragen musst du selbst aufteilen. Der Dienst verwirft oder teilt sie nicht stillschweigend auf; zu viele Fragen ergeben 400 request_limit_exceeded. Prüfe außerdem Token- und Optionsgrenzen unten.
Fragetypen und Bilder prüfen
Behalte state und das nach Fragenamen geordnete questions-Objekt bei. Nutze die unten beschriebenen Kriterienformen. Für Bilder verwendest du s1-vision über POST /v1/multimodal mit genau einem Bild im images-Array. Unterstützt sind PNG, JPEG und WebP als Daten-URL oder öffentliche HTTPS-URL; höchstens 4 MiB dekodiert und 2.000.000 Pixel. Die Textbeispiele unten testen keine Bildanfragen.
Antworten und Abrechnung auswerten
Lies Ergebnisse anhand der Fragenamen unter answers. Erfasse usage.input_tokens, usage.output_tokens und usage.decisions sowie die gemeldete model_version. Tokenzahlen stammen vom Modell, einschließlich Bildpositionen bei Bildanfragen. Nutze für Geldbeträge die Nutzungsbelege im Dashboard; rechne keine Zeichen in abrechenbare Tokens um.
Fehler, Wiederholungen und Rückfall testen
Teste ungültige Schlüssel, fehlendes Guthaben, Modellgrenzen, Ratenlimits und Zeitüberschreitungen. Nutze die Fehlercodes unten. Prüfe die Ergebnisse auf deinen eigenen Fällen und führe den Wechsel erst nach deinem Abnahmetest durch. Ein lokaler Vertragstest belegt keine Modellqualität oder Produktionsverfügbarkeit.
Fragetypen und aktuelle Eingabegrenzen
noul: Ja/Nein-Frage; die Antwort noul ist die Wahrscheinlichkeit für „ja“.
choice: criteria ist ein Objekt mit mindestens zwei stabilen Options-IDs. Die Antwort nennt choice, confidence und probabilities.
score: criteria ist ein geordnetes Array mit mindestens zwei Stufen. score ist der wahrscheinlichkeitsgewichtete Mittelwert der Stufen-Indizes ab 0 und kann Nachkommastellen haben.
Modell
Eingabe-Tokens je Frage
Fragen
Optionen
s1-fast
8.000
1
16
s1-pro
8.192
3
64
s1-vision
8.000
1
26
Jede Frage zählt einschließlich State, Kriterien und Prompt-Vorlage; bei s1-vision zählen auch Bildpositionen. Prüfe die vollständigen Eingabegrenzen.
Was beim Wechsel anders ist
Stand: 27. Oktober 2026. Die datierte Jev-Alternative-Seite und die Migrationshinweise (EN) beschreiben die Vertragsgrenze: eigene Schlüssel, Modell-IDs, Verarbeitungsstufen, Abrechnung, Limits, Metadaten und Fehler. Ein Wechsel zu einem anderen Modell erfordert eigene Ergebnistests. Bytegenaue Kompatibilität wird nicht behauptet.
Bewertungsrubriken brauchen bei uns mindestens zwei Stufen; TypeSafes veröffentlichtes Schema erlaubt auch eine einzelne Stufe. Überschreitungen der Fragegrenze sind nicht wiederholbare Fehler.
Mit Idempotency-Key erhältst du während einer laufenden Anfrage 202 in_progress. Nach Abrechnung oder bei unklarem Abrechnungsstatus folgt 409 idempotency_replay_unavailable mit Beleg und ohne zweite Belastung, aber ohne gespeicherte Antwort. Nach bestätigtem Fehlschlag ohne Antwort und Belastung darfst du denselben Schlüssel und Inhalt erneut senden. Ein anderer Inhalt unter demselben Schlüssel ergibt 409 idempotency_conflict. Nur eine bewusst neue Inferenz erhält einen neuen Schlüssel.
Getestete Textbeispiele
Jede der folgenden Dateien wurde unverändert gegen einen isolierten lokalen HTTP-Mock unseres veröffentlichten Vertrags getestet. Geprüft wurden Methode, Pfad, Bearer-Schlüssel, S1-Region und JSON-Inhalt sowie die Auswertung einer simulierten Antwort mit usage und model_version. Es gab keine Anfrage an den produktiven Dienst.
Setze DECISIONMODELS_API_KEY auf deinen Schlüssel. Die optionale Variable DECISIONMODELS_BASE_URL kann für Tests auf deinen lokalen Mock zeigen; ohne sie gilt die öffentliche API-Basis. Python-Beispiele benötigen Python 3.10 und die jeweils genannte Paketversion. Das Fetch-Beispiel ist JavaScript-kompatibles TypeScript, getestet mit Node.js 20.19.4.
LiteLLM entfernt das Anbieterpräfix typesafe/ vor dem Senden; am Server kam im Test s1-fast an. Für Ollama wurde nur der Python-Client getestet, nicht die CLI. Typisierte SDKs können zusätzliche Metadaten wie model_version verwerfen; die direkten HTTP-Beispiele erhalten sie.
curl 7.81.0
tested on 27 Oct 2026 against our published contract with curl 7.81.0
curl.sh
curl --fail-with-body --silent --show-error --max-time 15 \
"${DECISIONMODELS_BASE_URL:-https://api.decisionmodels.io}/v1/systemone" \
-H "Authorization: Bearer $DECISIONMODELS_API_KEY" \
-H 'Content-Type: application/json' \
-H 'S1-Region: eu' \
--data '{"model":"s1-fast","state":"Mia owns a red bicycle.","questions":{"color":{"type":"choice","instructions":"Which color is the bicycle?","criteria":{"red":null,"blue":null}}}}'
Python requests 2.32.5
tested on 27 Oct 2026 against our published contract with Python requests 2.32.5
requests.py
import os
import requests
base = os.environ.get("DECISIONMODELS_BASE_URL", "https://api.decisionmodels.io")
response = requests.post(
base + "/v1/systemone",
headers={
"Authorization": "Bearer " + os.environ["DECISIONMODELS_API_KEY"],
"S1-Region": "eu",
},
json={
"model": "s1-fast",
"state": "Mia owns a red bicycle.",
"questions": {"color": {
"type": "choice",
"instructions": "Which color is the bicycle?",
"criteria": {"red": None, "blue": None},
}},
},
timeout=15,
)
response.raise_for_status()
print(response.json())
Node.js fetch 20.19.4
tested on 27 Oct 2026 against our published contract with Node.js fetch 20.19.4
fetch.ts
// JavaScript-compatible TypeScript; native fetch in Node.js.
const base = process.env.DECISIONMODELS_BASE_URL ?? "https://api.decisionmodels.io";
const response = await fetch(`${base}/v1/systemone`, {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.DECISIONMODELS_API_KEY}`,
"Content-Type": "application/json",
"S1-Region": "eu",
},
body: JSON.stringify({
model: "s1-fast",
state: "Mia owns a red bicycle.",
questions: { color: {
type: "choice",
instructions: "Which color is the bicycle?",
criteria: { red: null, blue: null },
} },
}),
signal: AbortSignal.timeout(15000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
console.log(await response.json());
LiteLLM 1.106.4
tested on 27 Oct 2026 against our published contract with LiteLLM 1.106.4
litellm.py
import os
import litellm
response = litellm.systemone(
model="typesafe/s1-fast",
api_base=os.environ.get("DECISIONMODELS_BASE_URL", "https://api.decisionmodels.io"),
api_key=os.environ["DECISIONMODELS_API_KEY"],
extra_headers={"S1-Region": "eu"},
state="Mia owns a red bicycle.",
questions={"color": {
"type": "choice",
"instructions": "Which color is the bicycle?",
"criteria": {"red": None, "blue": None},
}},
timeout=15,
)
print(response.model_dump())
Ollama Python 0.6.3
tested on 27 Oct 2026 against our published contract with Ollama Python 0.6.3
ollama.py
import os
from ollama import Client
client = Client(
host=os.environ.get("DECISIONMODELS_BASE_URL", "https://api.decisionmodels.io"),
headers={
"Authorization": "Bearer " + os.environ["DECISIONMODELS_API_KEY"],
"S1-Region": "eu",
},
timeout=15,
)
response = client.systemone(
model="s1-fast",
state="Mia owns a red bicycle.",
questions={"color": {
"type": "choice",
"instructions": "Which color is the bicycle?",
"criteria": {"red": None, "blue": None},
}},
)
print(response.model_dump())
413 payload_too_large, 422 unsupported_modality: Eingabe verkleinern oder passende Modalität wählen.
429 rate_limit_exceeded: Retry-After beachten.
503 model_unavailable, capacity_limit, 504 inference_timeout: Die dokumentierte Wartezeit und den Abrechnungsstatus prüfen, bevor du erneut sendest. EU-Anfragen wechseln nie in eine Region außerhalb der EU.
Nächster Schritt
Prüfe die vollständigen Migrationshinweise und deine eigenen Testfälle, bevor du produktive Anfragen umstellst.