Documentation

Compatibilité TypeSafe

Le modèle Jev fermé de TypeSafe a créé la catégorie « System One » des modèles de décision. L’API /v1/* d’Ollaya est identique au niveau du protocole à celle de TypeSafe, telle que la définissent le schéma de transmission et la gestion des erreurs de typesafe-sdk 0.7.1, donc le code écrit pour TypeSafe s’exécute contre des modèles ouverts sur ta propre machine.

Pointe le SDK vers Ollaya

Le SDK Python officiel de TypeSafe 0.7.1 fonctionne sans modification. Définis ces variables d’environnement :

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
  • Modèle par défaut. winnow:e4b est le plus proche de Jev (0.722 sur les décisions typées, contre 0.738) et répond en environ 90 ms sur une RTX 4090. Sans GPU NVIDIA, utilise laya, qui répond en une fraction de seconde sur un CPU.
  • Clé d’API. Ollaya accepte n’importe quelle clé, sauf si le serveur définit OLLAYA_API_KEY ; alors la clé du SDK doit correspondre.
  • IDs de requête. Chaque réponse porte x-typesafe-request-id, donc response.request_id fonctionne.
  • Nouvelles tentatives. Le SDK expire après 10 s et réessaie. La première requête vers un modèle attend son chargement, et un chargement qui survit à la requête continue, donc la nouvelle tentative trouve le modèle chaud.
  • Proxys système. Sur un Mac avec un proxy HTTP système, le SDK TypeSafe (comme httpx) envoie aussi les requêtes vers localhost via le proxy, en ignorant la liste d’exceptions du système. Tes états passent alors par le proxy, et pendant qu’Ollaya est arrêté, le SDK signale 502 status code (no body) au lieu d’une connexion refusée. Définis NO_PROXY=localhost,127.0.0.1 à côté de TYPESAFE_BASE_URL.
  • Préchauffage et temps. Pour charger un modèle avant la première requête, envoie {"model": "winnow:e4b", "keep_alive": -1} à /api/decide (sans state). Les réponses /v1/* ne portent pas de temps, comme celles de TypeSafe ; /api/decide rapporte total_duration, load_duration et eval_duration.

Points de terminaison

Point de terminaison Description
POST /v1/systemone Décide. Requête : model, state (obligatoire) et questions. Réponse : exactement model, answers et usage.
POST /v1/decisions Alias de /v1/systemone
GET /v1/models Les modèles de cette machine : name, description, release_date

Requête et réponse

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 dans la réponse est le checkpoint qui a répondu : laya est un routeur, et cette requête anglaise est allée à laya:en. Le schéma de TypeSafe l’autorise (« may differ from the alias supplied in the request »). Les valeurs ont 4 décimales, et probabilities suivent l’ordre de 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 liste les modèles tirés sur cette machine, routeurs compris ; il ne liste pas le registre.

Erreurs

Les erreurs portent les codes de statut de TypeSafe et un corps que le SDK lit correctement : un error de type chaîne (que le SDK affiche), un code lisible par machine et, sur 422, la liste detail des problèmes de validation de TypeSafe. Voir erreurs pour chaque code.

{"error": "model \"jev-latest:latest\" not found, try pulling it first", "code": "MODEL_NOT_FOUND"}

Ce qui diffère

La compatibilité couvre l’API, pas le modèle :

  • Les noms de modèles sont ceux d’Ollaya (laya, laya:en), donc définis TYPESAFE_DEFAULT_MODEL ou passe model.
  • instructions manquant. Quand une question n’en a pas, le modèle lit l’id de la question à la place, donc nomme les questions de façon descriptive (is_urgent, tone).
  • Limites. Au plus 256 questions par requête, 2–255 choix et 2–10 niveaux de score. Chaque modèle a aussi un budget d’options : environ 125 options pour laya:en, 250 pour laya:multilingual.
  • États longs. TypeSafe lit jusqu’à 65 536 jetons ; le contexte d’un modèle ouvert est plus court (512 jetons pour laya:en, 1 024 pour laya:multilingual, questions comprises). Quand un état ne tient pas, /v1/* renvoie 422 STATE_TRUNCATED plutôt que de répondre à partir d’une partie. Utilise un modèle à contexte plus long, raccourcis l’état, ou appelle /api/decide, qui tronque et signale state_truncated.
  • /v1/* reste pur. Les champs natifs tels que keep_alive et extras y sont ignorés ; le routage, les temps et la troncature sont signalés sur /api/decide.
  • La qualité vient de modèles ouverts, donc elle diffère de celle de Jev selon la tâche :
    • laya:typed-decisions obtient 0.766 sur les décisions typées, contre 0.727 publié pour Jev 1.13.
    • Les checkpoints Laya de base sont proches du hasard en zero-shot sur les décisions typées (0.362).
    • Les questions choice à nombreuses options (plus de ~20) sont plus faibles : 0.425 sur Banking77, contre 0.870 pour Jev.

Mesure sur tes propres données avant de basculer le trafic de production. La page Laya contient les détails.

Sans affiliation

Ollaya est un projet open source indépendant. Il n’est ni affilié à TypeSafe ni approuvé par TypeSafe.