Documentación

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:e4b es 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, usa laya, 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í que response.request_id funciona.
  • 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 a localhost a 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 de 502 status code (no body) en lugar de una conexión rechazada. Define NO_PROXY=localhost,127.0.0.1 junto a TYPESAFE_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 (sin state). Las respuestas de /v1/* no llevan tiempos, como las de TypeSafe; /api/decide informa de total_duration, load_duration y eval_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 define TYPESAFE_DEFAULT_MODEL o pasa model.
  • instructions ausente. 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 para laya: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 para laya:multilingual, incluidas las preguntas). Cuando un estado no cabe, /v1/* devuelve 422 STATE_TRUNCATED en 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 de state_truncated.
  • /v1/* se mantiene puro. Los campos nativos como keep_alive y extras se 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-decisions obtiene 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.