Совместимость с TypeSafe
Закрытая модель Jev от TypeSafe создала категорию моделей решений «System One». API /v1/* в Ollaya идентичен на уровне протокола API TypeSafe — в том виде, в каком его определяют схема передачи и обработка ошибок typesafe-sdk 0.7.1, — поэтому код, написанный для TypeSafe, работает с открытыми моделями на вашей собственной машине.
Направьте SDK на Ollaya
Официальный Python SDK TypeSafe 0.7.1 работает без изменений. Задайте эти переменные окружения:
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
- Модель по умолчанию.
winnow:e4bближе всего к Jev (0.722 на типизированных решениях против 0.738) и отвечает примерно за 90 мс на RTX 4090. Без GPU NVIDIA используйтеlaya, которая отвечает за доли секунды на CPU. - API key. Ollaya принимает любой key, если только сервер не задаёт
OLLAYA_API_KEY; тогда key в SDK должен совпадать с ним. - ID запросов. Каждый ответ несёт
x-typesafe-request-id, поэтомуresponse.request_idработает. - Повторы. SDK завершается по тайм-ауту через 10 с и повторяет. Первый запрос к модели ждёт её загрузки, а загрузка, которая переживает запрос, продолжается, поэтому повтор застаёт модель прогретой.
- Системные прокси. На Mac с системным HTTP-прокси SDK TypeSafe (как и
httpx) отправляет запросы кlocalhostтоже через прокси, игнорируя список исключений системы. Ваши состояния тогда идут через прокси, и пока Ollaya недоступна, SDK сообщает502 status code (no body)вместо отказа в соединении. ЗадайтеNO_PROXY=localhost,127.0.0.1рядом сTYPESAFE_BASE_URL. - Прогрев и тайминги. Чтобы загрузить модель до первого запроса, отправьте
{"model": "winnow:e4b", "keep_alive": -1}в/api/decide(безstate). Ответы/v1/*не несут таймингов, как и у TypeSafe;/api/decideсообщаетtotal_duration,load_durationиeval_duration.
Эндпоинты
| Эндпоинт | Описание |
|---|---|
POST /v1/systemone |
Решение. Запрос: model, state (обязательно) и questions. Ответ: ровно model, answers и usage. |
POST /v1/decisions |
Псевдоним /v1/systemone |
GET /v1/models |
Модели на этой машине: name, description, release_date |
Запрос и ответ
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 в ответе — это чекпойнт, который ответил: laya — это router, и этот английский запрос ушёл в laya:en. Схема TypeSafe это допускает («may differ from the alias supplied in the request»). Значения имеют 4 знака после запятой, а probabilities идут в порядке 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 перечисляет модели, загруженные на эту машину, включая router; реестр он не перечисляет.
Ошибки
Ошибки несут коды состояния TypeSafe и тело, которое SDK читает правильно: строковый error (SDK его показывает), машиночитаемый code и на 422 — список detail проблем валидации от TypeSafe. Каждый код см. в разделе ошибки.
{"error": "model \"jev-latest:latest\" not found, try pulling it first", "code": "MODEL_NOT_FOUND"}
Что отличается
Совместимость охватывает API, а не модель:
- Имена моделей принадлежат Ollaya (
laya,laya:en), поэтому задайтеTYPESAFE_DEFAULT_MODELили передайтеmodel. - Отсутствует
instructions. Когда у вопроса его нет, модель вместо него читает id вопроса, поэтому давайте вопросам описательные имена (is_urgent,tone). - Ограничения. Не более 256 вопросов на запрос, 2–255 вариантов и 2–10 уровней score. У каждой модели есть также бюджет вариантов: около 125 вариантов для
laya:en, 250 дляlaya:multilingual. - Длинные состояния. TypeSafe читает до 65 536 токенов; контекст открытой модели короче (512 токенов для
laya:en, 1 024 дляlaya:multilingual, включая вопросы). Когда состояние не помещается,/v1/*возвращает422 STATE_TRUNCATED, а не отвечает по его части. Используйте модель с более длинным контекстом, сократите состояние или вызовите/api/decide, который обрезает и сообщаетstate_truncated. /v1/*остаётся чистым. Такие нативные поля, какkeep_aliveиextras, там игнорируются; маршрутизация, тайминги и обрезка сообщаются в/api/decide.- Качество исходит от открытых моделей, поэтому оно отличается от Jev в зависимости от задачи:
laya:typed-decisionsнабирает 0.766 на типизированных решениях против 0.727, опубликованных для Jev 1.13.- Базовые чекпойнты Laya на типизированных решениях близки к случайному угадыванию zero-shot (0.362).
- Choice-вопросы со многими вариантами (более ~20) слабее: 0.425 на Banking77 против 0.870 у Jev.
Прежде чем переключать продакшен-трафик, измерьте на собственных данных. На странице Laya есть подробности.
Не аффилирована
Ollaya — независимый проект с открытым исходным кодом. Он не связан с TypeSafe и не одобрен TypeSafe.