Документация

Совместимость с 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.