Compatibilidad con TypeSafe
El modelo Jev cerrado de TypeSafe creó la categoría «System One» de los modelos de decisión. La API /v1/* de Ollaya es idéntica en el protocolo a la de TypeSafe, tal como la definen el esquema de transmisión y el manejo de errores de typesafe-sdk 0.7.1, así que el código escrito para TypeSafe se ejecuta contra modelos abiertos en tu propia máquina.
Apunta el SDK a Ollaya
El SDK oficial de TypeSafe para Python 0.7.1 funciona sin cambios. Define estas variables de entorno:
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
- Modelo predeterminado.
winnow:e4bes el más cercano a Jev (0.722 en decisiones tipadas, frente a 0.738) y responde en unos 90 ms en una RTX 4090. Sin GPU NVIDIA, usalaya, que responde en una fracción de segundo en una CPU. - API key. Ollaya acepta cualquier key, a menos que el servidor defina
OLLAYA_API_KEY; entonces la key del SDK debe coincidir con ella. - IDs de solicitud. Cada respuesta lleva
x-typesafe-request-id, así queresponse.request_idfunciona. - Reintentos. El SDK agota el tiempo a los 10 s y reintenta. La primera solicitud a un modelo espera mientras carga, y una carga que sobrevive a la solicitud continúa, así que el reintento encuentra el modelo caliente.
- Proxies del sistema. En un Mac con un proxy HTTP del sistema, el SDK de TypeSafe (igual que
httpx) envía también las solicitudes alocalhosta través del proxy, ignorando la lista de excepciones del sistema. Tus estados pasan entonces por el proxy, y mientras Ollaya está caído el SDK informa de502 status code (no body)en lugar de una conexión rechazada. DefineNO_PROXY=localhost,127.0.0.1junto aTYPESAFE_BASE_URL. - Calentamiento y tiempos. Para cargar un modelo antes de la primera solicitud, envía
{"model": "winnow:e4b", "keep_alive": -1}a/api/decide(sinstate). Las respuestas de/v1/*no llevan tiempos, como las de TypeSafe;/api/decideinforma detotal_duration,load_durationyeval_duration.
Endpoints
| Endpoint | Descripción |
|---|---|
POST /v1/systemone |
Decide. Solicitud: model, state (obligatorio) y questions. Respuesta: exactamente model, answers y usage. |
POST /v1/decisions |
Alias de /v1/systemone |
GET /v1/models |
Los modelos de esta máquina: name, description, release_date |
Solicitud y respuesta
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 en la respuesta es el checkpoint que respondió: laya es un router, y esta solicitud en inglés fue a laya:en. El esquema de TypeSafe permite esto (“may differ from the alias supplied in the request”). Los valores tienen 4 decimales, y probabilities siguen el orden 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 lista los modelos descargados a esta máquina, routers incluidos; no lista el registro.
Errores
Los errores llevan los códigos de estado de TypeSafe y un cuerpo que el SDK lee correctamente: un error de tipo cadena (que el SDK muestra), un code legible por máquina y, en 422, la lista detail de problemas de validación de TypeSafe. Consulta errores para cada código.
{"error": "model \"jev-latest:latest\" not found, try pulling it first", "code": "MODEL_NOT_FOUND"}
Qué es diferente
La compatibilidad cubre la API, no el modelo:
- Los nombres de modelo son de Ollaya (
laya,laya:en), así que defineTYPESAFE_DEFAULT_MODELo pasamodel. instructionsausente. Cuando una pregunta no tiene ninguna, el modelo lee el id de la pregunta en su lugar, así que pon nombres descriptivos a las preguntas (is_urgent,tone).- Límites. Como máximo 256 preguntas por solicitud, 2–255 opciones y 2–10 niveles de score. Cada modelo tiene además un presupuesto de opciones: unas 125 opciones para
laya:en, 250 paralaya:multilingual. - Estados largos. TypeSafe lee hasta 65,536 tokens; el contexto de un modelo abierto es más corto (512 tokens para
laya:en, 1,024 paralaya:multilingual, incluidas las preguntas). Cuando un estado no cabe,/v1/*devuelve422 STATE_TRUNCATEDen lugar de responder con una parte. Usa un modelo con un contexto más largo, acorta el estado o llama a/api/decide, que trunca e informa destate_truncated. /v1/*se mantiene puro. Los campos nativos comokeep_aliveyextrasse ignoran allí; el enrutado, los tiempos y el truncado se informan en/api/decide.- La calidad viene de modelos abiertos, así que difiere de la de Jev según la tarea:
laya:typed-decisionsobtiene 0.766 en decisiones tipadas, frente al 0.727 publicado para Jev 1.13.- Los checkpoints base de Laya están cerca del azar zero-shot en decisiones tipadas (0.362).
- Las preguntas choice con muchas opciones (más de ~20) son más débiles: 0.425 en Banking77, frente a 0.870 para Jev.
Mide con tus propios datos antes de cambiar el tráfico de producción. La página de Laya tiene los detalles.
Sin afiliación
Ollaya es un proyecto de código abierto independiente. No está afiliado a TypeSafe ni respaldado por TypeSafe.