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:e4best 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, utiliselaya, 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, doncresponse.request_idfonctionne. - 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 verslocalhostvia 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 signale502 status code (no body)au lieu d’une connexion refusée. DéfinisNO_PROXY=localhost,127.0.0.1à côté deTYPESAFE_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(sansstate). Les réponses/v1/*ne portent pas de temps, comme celles de TypeSafe ;/api/deciderapportetotal_duration,load_durationeteval_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éfinisTYPESAFE_DEFAULT_MODELou passemodel. instructionsmanquant. 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 pourlaya: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 pourlaya:multilingual, questions comprises). Quand un état ne tient pas,/v1/*renvoie422 STATE_TRUNCATEDplutô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 signalestate_truncated. /v1/*reste pur. Les champs natifs tels quekeep_aliveetextrasy 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-decisionsobtient 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.