Documentação

Compatibilidade com TypeSafe

O modelo Jev fechado da TypeSafe criou a categoria “System One” de modelos de decisão. A API /v1/* do Ollaya é idêntica ao nível do protocolo à da TypeSafe, conforme definida pelo esquema de transmissão e pelo tratamento de erros do typesafe-sdk 0.7.1, por isso o código escrito para a TypeSafe corre contra modelos abertos na tua própria máquina.

Aponta o SDK para o Ollaya

O SDK oficial da TypeSafe para Python 0.7.1 funciona sem alterações. Define estas variáveis de ambiente:

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 predefinido. winnow:e4b é o mais próximo do Jev (0.722 em decisões tipadas, contra 0.738) e responde em cerca de 90 ms numa RTX 4090. Sem GPU NVIDIA, usa laya, que responde numa fração de segundo num CPU.
  • Chave de API. O Ollaya aceita qualquer chave, a menos que o servidor defina OLLAYA_API_KEY; nesse caso a chave do SDK tem de corresponder.
  • IDs de pedido. Cada resposta traz x-typesafe-request-id, por isso response.request_id funciona.
  • Tentativas. O SDK expira após 10 s e tenta de novo. O primeiro pedido a um modelo espera enquanto ele carrega, e um carregamento que sobrevive ao pedido continua, por isso a nova tentativa encontra o modelo quente.
  • Proxies do sistema. Num Mac com um proxy HTTP do sistema, o SDK da TypeSafe (como o httpx) envia também os pedidos para localhost através do proxy, ignorando a lista de exceções do sistema. Os teus estados passam então pelo proxy, e enquanto o Ollaya está em baixo o SDK reporta 502 status code (no body) em vez de uma ligação recusada. Define NO_PROXY=localhost,127.0.0.1 ao lado de TYPESAFE_BASE_URL.
  • Aquecimento e tempos. Para carregar um modelo antes do primeiro pedido, envia {"model": "winnow:e4b", "keep_alive": -1} para /api/decide (sem state). As respostas de /v1/* não trazem tempos, como as da TypeSafe; /api/decide reporta total_duration, load_duration e eval_duration.

Endpoints

Endpoint Descrição
POST /v1/systemone Decide. Pedido: model, state (obrigatório) e questions. Resposta: exatamente model, answers e usage.
POST /v1/decisions Alias de /v1/systemone
GET /v1/models Os modelos desta máquina: name, description, release_date

Pedido e resposta

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 na resposta é o checkpoint que respondeu: laya é um router, e este pedido em inglês foi para laya:en. O esquema da TypeSafe permite isso (“may differ from the alias supplied in the request”). Os valores têm 4 casas decimais, e probabilities seguem a ordem 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 os modelos transferidos para esta máquina, routers incluídos; não lista o registo.

Erros

Os erros trazem os códigos de estado da TypeSafe e um corpo que o SDK lê corretamente: um error de string (que o SDK mostra), um code legível por máquina e, em 422, a lista detail de problemas de validação da TypeSafe. Vê erros para cada código.

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

O que é diferente

A compatibilidade cobre a API, não o modelo:

  • Os nomes de modelo são do Ollaya (laya, laya:en), por isso define TYPESAFE_DEFAULT_MODEL ou passa model.
  • instructions em falta. Quando uma pergunta não tem nenhuma, o modelo lê o id da pergunta no seu lugar, por isso dá nomes descritivos às perguntas (is_urgent, tone).
  • Limites. No máximo 256 perguntas por pedido, 2–255 opções e 2–10 níveis de score. Cada modelo tem também um orçamento de opções: cerca de 125 opções para laya:en, 250 para laya:multilingual.
  • Estados longos. A TypeSafe lê até 65,536 tokens; o contexto de um modelo aberto é mais curto (512 tokens para laya:en, 1,024 para laya:multilingual, incluindo as perguntas). Quando um estado não cabe, /v1/* devolve 422 STATE_TRUNCATED em vez de responder com parte dele. Usa um modelo com contexto mais longo, encurta o estado ou chama /api/decide, que trunca e reporta state_truncated.
  • /v1/* permanece puro. Campos nativos como keep_alive e extras são ignorados ali; encaminhamento, tempos e truncagem são reportados em /api/decide.
  • A qualidade vem de modelos abertos, por isso difere da do Jev conforme a tarefa:
    • laya:typed-decisions obtém 0.766 em decisões tipadas, contra 0.727 publicado para o Jev 1.13.
    • Os checkpoints base do Laya ficam perto do acaso zero-shot em decisões tipadas (0.362).
    • Perguntas choice com muitas opções (mais de ~20) são mais fracas: 0.425 no Banking77, contra 0.870 do Jev.

Mede nos teus próprios dados antes de trocar o tráfego de produção. A página do Laya tem os detalhes.

Sem afiliação

O Ollaya é um projeto de código aberto independente. Não é afiliado à TypeSafe nem endossado por ela.