TypeSafe-Kompatibilität
TypeSafes geschlossenes Jev-Modell begründete die Kategorie der Entscheidungsmodelle namens „System One“. Ollayas /v1/*-API ist auf der Leitungsebene identisch mit der von TypeSafe, wie sie durch das Wire-Schema und die Fehlerbehandlung von typesafe-sdk 0.7.1 definiert ist, sodass für TypeSafe geschriebener Code gegen offene Modelle auf deinem eigenen Rechner läuft.
Richte das SDK auf Ollaya aus
Das offizielle TypeSafe Python SDK 0.7.1 funktioniert unverändert. Setze diese Umgebungsvariablen:
export TYPESAFE_BASE_URL=http://localhost:11435
export TYPESAFE_API_KEY=local # the SDK needs a non-empty key; any value works
export TYPESAFE_DEFAULT_MODEL=winnow:e4b # otherwise the SDK sends its default, "jev-latest"
export NO_PROXY=localhost,127.0.0.1 # keep local requests off any system proxy
- Standardmodell.
winnow:e4bkommt Jev am nächsten (0,722 bei typisierten Entscheidungen, gegen 0,738) und antwortet in etwa 90 ms auf einer RTX 4090. Ohne NVIDIA-GPU verwendelaya, das auf einer CPU in Sekundenbruchteilen antwortet. - API key. Ollaya akzeptiert jeden key, es sei denn, der Server setzt
OLLAYA_API_KEY; dann muss der key des SDK damit übereinstimmen. - Anfrage-IDs. Jede Antwort trägt
x-typesafe-request-id, daher funktioniertresponse.request_id. - Wiederholungen. Das SDK läuft nach 10 s in einen Timeout und wiederholt. Die erste Anfrage an ein Modell wartet, während es lädt, und ein Ladevorgang, der die Anfrage überlebt, läuft weiter, sodass die Wiederholung das Modell warm vorfindet.
- System-Proxys. Auf einem Mac mit einem System-HTTP-Proxy schickt das TypeSafe SDK (wie
httpx) Anfragen fürlocalhostebenfalls durch den Proxy und ignoriert die Ausnahmeliste des Systems. Deine Zustände laufen dann durch den Proxy, und während Ollaya nicht läuft, meldet das SDK502 status code (no body)statt einer verweigerten Verbindung. SetzeNO_PROXY=localhost,127.0.0.1nebenTYPESAFE_BASE_URL. - Aufwärmen und Zeiten. Um ein Modell vor der ersten Anfrage zu laden, sende
{"model": "winnow:e4b", "keep_alive": -1}an/api/decide(ohnestate)./v1/*-Antworten tragen keine Zeiten, wie die von TypeSafe;/api/decidemeldettotal_duration,load_durationundeval_duration.
Endpunkte
| Endpunkt | Beschreibung |
|---|---|
POST /v1/systemone |
Entscheiden. Anfrage: model, state (erforderlich) und questions. Antwort: genau model, answers und usage. |
POST /v1/decisions |
Alias von /v1/systemone |
GET /v1/models |
Die Modelle auf diesem Rechner: name, description, release_date |
Anfrage und Antwort
curl http://localhost:11435/v1/systemone \
-H "Authorization: Bearer local" \
-d '{
"model": "laya",
"state": "Can I get an invoice for last month?",
"questions": {
"intent": {
"type": "choice",
"instructions": "What does the customer want?",
"criteria": {
"invoice": "Needs an invoice or receipt",
"refund": "Wants money back",
"other": "Anything else"
}
}
}
}'
{
"model": "laya:en",
"answers": {
"intent": {
"type": "choice",
"choice": "invoice",
"confidence": 0.9547,
"probabilities": {"invoice": 0.9698, "refund": 0.0172, "other": 0.013}
}
},
"usage": {"input_tokens": 43, "output_tokens": 0}
}
model in der Antwort ist der Checkpoint, der geantwortet hat: laya ist ein Router, und diese englische Anfrage ging an laya:en. TypeSafes Schema erlaubt das („may differ from the alias supplied in the request“). Werte haben 4 Dezimalstellen, und probabilities folgen der Reihenfolge von criteria.
curl http://localhost:11435/v1/models -H "Authorization: Bearer local"
{
"models": [
{
"name": "laya:en",
"description": "English decision model (ModernBERT-large): guardrails, email and ticket triage.",
"release_date": "2026-09-23"
},
{
"name": "laya:latest",
"description": "Routes each request to laya:en or laya:multilingual by the text's script and language.",
"release_date": "2026-09-23"
},
{
"name": "laya:multilingual",
"description": "Decision model for 100+ languages (mmBERT-base).",
"release_date": "2026-09-23"
}
]
}
/v1/models listet die auf diesen Rechner geladenen Modelle auf, Router eingeschlossen; die Registry listet es nicht.
Fehler
Fehler tragen TypeSafes Statuscodes und einen Body, den das SDK korrekt liest: einen String error (den das SDK anzeigt), einen maschinenlesbaren code und bei 422 TypeSafes detail-Liste der Validierungsprobleme. Jeden Code findest du unter Fehler.
{"error": "model \"jev-latest:latest\" not found, try pulling it first", "code": "MODEL_NOT_FOUND"}
Was anders ist
Die Kompatibilität umfasst die API, nicht das Modell:
- Modellnamen sind Ollayas (
laya,laya:en), also setzeTYPESAFE_DEFAULT_MODELoder übergibmodel. - Fehlende
instructions. Wenn eine Frage keine hat, liest das Modell an ihrer Stelle die Frage-ID, also benenne Fragen beschreibend (is_urgent,tone). - Grenzen. Höchstens 256 Fragen pro Anfrage, 2–255 Auswahlmöglichkeiten und 2–10 score-Stufen. Jedes Modell hat außerdem ein Optionsbudget: etwa 125 Optionen für
laya:en, 250 fürlaya:multilingual. - Lange Zustände. TypeSafe liest bis zu 65.536 Token; der Kontext eines offenen Modells ist kürzer (512 Token für
laya:en, 1.024 fürlaya:multilingual, einschließlich der Fragen). Passt ein Zustand nicht, gibt/v1/*422 STATE_TRUNCATEDzurück, statt aus einem Teil davon zu antworten. Verwende ein Modell mit längerem Kontext, kürze den Zustand oder rufe/api/decideauf, das abschneidet undstate_truncatedmeldet. /v1/*bleibt rein. Native Felder wiekeep_aliveundextraswerden dort ignoriert; Routing, Zeiten und Kürzung werden auf/api/decidegemeldet.- Qualität kommt von offenen Modellen, unterscheidet sich also je nach Aufgabe von Jev:
laya:typed-decisionserreicht 0,766 bei typisierten Entscheidungen, gegen 0,727, die für Jev 1.13 veröffentlicht wurden.- Die Basis-Laya-Checkpoints liegen bei typisierten Entscheidungen zero-shot nahe am Zufall (0,362).
- Choice-Fragen mit vielen Optionen (mehr als ~20) sind schwächer: 0,425 auf Banking77, gegen 0,870 für Jev.
Messe an deinen eigenen Daten, bevor du Produktionsverkehr umstellst. Die Laya-Seite hat die Details.
Nicht verbunden
Ollaya ist ein unabhängiges Open-Source-Projekt. Es ist weder mit TypeSafe verbunden noch von TypeSafe unterstützt.