Dokumentation

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:e4b kommt 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 verwende laya, 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 funktioniert response.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ür localhost ebenfalls 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 SDK 502 status code (no body) statt einer verweigerten Verbindung. Setze NO_PROXY=localhost,127.0.0.1 neben TYPESAFE_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 (ohne state). /v1/*-Antworten tragen keine Zeiten, wie die von TypeSafe; /api/decide meldet total_duration, load_duration und eval_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 setze TYPESAFE_DEFAULT_MODEL oder übergib model.
  • 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ür laya: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ür laya:multilingual, einschließlich der Fragen). Passt ein Zustand nicht, gibt /v1/* 422 STATE_TRUNCATED zurück, statt aus einem Teil davon zu antworten. Verwende ein Modell mit längerem Kontext, kürze den Zustand oder rufe /api/decide auf, das abschneidet und state_truncated meldet.
  • /v1/* bleibt rein. Native Felder wie keep_alive und extras werden dort ignoriert; Routing, Zeiten und Kürzung werden auf /api/decide gemeldet.
  • Qualität kommt von offenen Modellen, unterscheidet sich also je nach Aufgabe von Jev:
    • laya:typed-decisions erreicht 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.