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, usalaya, 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 issoresponse.request_idfunciona. - 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 paralocalhostatravé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 reporta502 status code (no body)em vez de uma ligação recusada. DefineNO_PROXY=localhost,127.0.0.1ao lado deTYPESAFE_BASE_URL. - Aquecimento e tempos. Para carregar um modelo antes do primeiro pedido, envia
{"model": "winnow:e4b", "keep_alive": -1}para/api/decide(semstate). As respostas de/v1/*não trazem tempos, como as da TypeSafe;/api/decidereportatotal_duration,load_durationeeval_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 defineTYPESAFE_DEFAULT_MODELou passamodel. instructionsem 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 paralaya: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 paralaya:multilingual, incluindo as perguntas). Quando um estado não cabe,/v1/*devolve422 STATE_TRUNCATEDem vez de responder com parte dele. Usa um modelo com contexto mais longo, encurta o estado ou chama/api/decide, que trunca e reportastate_truncated. /v1/*permanece puro. Campos nativos comokeep_aliveeextrassã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-decisionsobté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.